4

私はいくつかのテストケースでこの関数を書きました:

characterCounter <- function(char1, char2) {
    if(is.null(char1) || is.null(char2)) {
        print("Please check your character sequences!")
        return()
    }

    if(nchar(char1, type = "chars") < nchar(char2, type = "chars") || nchar(char1, type = "chars") <= nchar(char2, type = "chars")) {
        cat(sprintf("%s is smaller or smaller-equal than %s\n", char1 , char2))
        return()
    } else if(nchar(char1, type = "chars") > nchar(char2, type = "chars") || nchar(char1, type = "chars") >= nchar(char2, type = "chars")) {
        cat(sprintf("%s is greater or greater-equal than %s\n", char1 , char2))
        return()
    } else if(nchar(char1, type = "chars") == nchar(char2, type = "chars")) {
        cat(sprintf("%s is equal to %s\n", char1, char2))
        return()
    }
}

#Testcases
(characterCounter("Hello","Hell"))
(characterCounter("Wor","World"))

ただし、各ケースの後、私は戻ってきます:

> (characterCounter("Hello","Hell"))
Hello is greater or greater-equal than Hell
NULL
> (characterCounter("Wor","World"))
Wor is smaller or smaller-equal than World
NULL

私の出力で気に入らないのは、末尾のNULL. なぜ私はこれを取り戻すのですか?(文字カウンター(NULL,NULL))

アップデート

characterCounter <- function(char1, char2) {
    if(is.null(char1) || is.null(char2)) {
        return(cat("Please check your character sequences!"))
    }

    if(nchar(char1, type = "chars") < nchar(char2, type = "chars") || nchar(char1, type = "chars") <= nchar(char2, type = "chars")) {
        return(cat(sprintf("%s is smaller or smaller-equal than %s\n", char1 , char2)))
    } else if(nchar(char1, type = "chars") > nchar(char2, type = "chars") || nchar(char1, type = "chars") >= nchar(char2, type = "chars")) {
        return(cat(sprintf("%s is greater or greater-equal than %s\n", char1 , char2)))
    } else if(nchar(char1, type = "chars") == nchar(char2, type = "chars")) {
        return(cat(sprintf("%s is equal to %s\n", char1, char2)))
    }
}
4

2 に答える 2

3

R のすべての関数は何らかの値を返します。return明示的な戻り値がない場合は、呼び出しの引数または最後に評価されたステートメントになります。

次の 3 つの関数を検討してください。

f1 <- function() {
  cat("Hello, world!\n")
  return (NULL)
}

f2 <- function() {
  cat("Hello, world!\n")
  NULL
}

f3 <- function() {
  cat("Hello, world!\n")
}

それらを実行すると、次のようになります。

> f1()
Hello, world!
NULL
> f2()
Hello, world!
NULL
> f3()
Hello, world!

しかし、3 番目の関数も を返します。これは、 を代入して評価NULLすることで簡単に確認できます。違いはなぜですか?x <- f3()x

その理由は、一部の関数が目に見えない値を返すためです。つまり、invisible()関数を使用しており、トップレベルで関数を評価したときにこれらの値が出力されません。例えば

f4 <- function() {
  cat("hello, world!\n")
  invisible(1)
}

は 1 を返します (戻り値を何らかの変数に代入することで確認できます) が、最上位から呼び出されたときに 1 を出力しません。そして、catはその値を目に見えない形で返す (常に であるNULL) ため、f3の戻り値も目に見えないことがわかります。

于 2013-10-04T21:58:44.897 に答える