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

你得到NULL,因为那是你返回的。尝试使用invisible

f1 = function() {
    cat('smth\n')
    return()
}

f2 = function() {
    cat('smth\n')
    return(invisible())
}

f1()
#smth
#NULL
f2()
#smth

请注意,如果您使用额外的括号强制输出,您仍然会得到NULL

(f2())
#smth
#NULL

最后,作为一般的编程说明,我认为除了单行之外,非常希望return在函数和解决方案中有一个声明,通过不返回来避免输出并不是那么好。

于 2013-10-04T21:57:18.953 回答
3

R 中的每个函数都会返回一些值。return如果没有明确的返回值,它将是调用的参数或最后评估的语句。

考虑三个函数:

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!

然而,第三个函数也返回,因为您可以通过分配和评估NULL轻松检查。为什么有区别?x <- f3()x

原因是有些函数不可见地返回它们的值,即使用invisible()函数,而当您在顶层评估函数时,这些值不会打印出来。例如

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

将返回 1(您可以通过将其返回值分配给某个变量来检查),但在从顶层调用时不会打印 1。事实证明,它的返回值是cat不可见的(它总是NULL),因此f3的返回值也是不可见的。

于 2013-10-04T21:58:44.897 回答