【问题标题】:What does the function invisible() do?函数 invisible() 有什么作用?
【发布时间】:2012-07-24 02:02:36
【问题描述】:

R 帮助将invisible() 解释为“一个返回对象临时不可见副本的函数”。我很难理解invisible() 的用途。您能否解释一下invisible() 的作用以及此功能何时有用?

我看到invisible() 几乎总是用于print() 的方法函数中。这是一个例子:

### My Method function:
print.myPrint <- function(x, ...){
  print(unlist(x[1:2]))
  invisible(x)
}

x = list(v1 = c(1:5), v2 = c(-1:-5) )
class(x) = "myPrint"
print(x)

我在想,如果没有invisible(x),我将无法执行以下任务:

a = print(x)

但实际上并非如此。 那么,我想知道invisible()是做什么的,它在哪里有用,最后在上面的方法打印函数中它的作用是什么?

非常感谢您的帮助。

【问题讨论】:

  • 我可以给你答案,但我不能给你看。

标签: r


【解决方案1】:

来自?invisible

详情:

 This function can be useful when it is desired to have functions
 return values which can be assigned, but which do not print when
 they are not assigned.

所以你可以分配结果,但是如果没有分配它就不会被打印出来。它经常用来代替return。您的print.myPrint 方法只打印,因为您明确调用print。在函数末尾调用invisible(x) 只会返回x 的副本。

如果你没有使用invisiblex 如果没有分配也会被打印出来。例如:

R> print.myPrint <- function(x, ...){
+   print(unlist(x[1:2]))
+   return(x)
+ }
R> print(x)
v11 v12 v13 v14 v15 v21 v22 v23 v24 v25 
  1   2   3   4   5  -1  -2  -3  -4  -5 
v11 v12 v13 v14 v15 v21 v22 v23 v24 v25 
  1   2   3   4   5  -1  -2  -3  -4  -5 

【讨论】:

  • “它经常被用来代替回报”的表述对我来说似乎不正确。 R 函数只返回其最后一条语句/表达式的值,因此可以省略作为最后一条语句的“return”。因此,正确的表述应该是:“inivisible(x) 经常使用 with return 作为“return(invisible(x))”,并且作为最后一个语句,“return”可以省略。目的是使函数返回一个对象,而不是在它在命令行上键入的函数时打印它。
【解决方案2】:

虽然invisible() 使其内容暂时不可见并且经常代替return() 使用,但它应该与return() 结合使用,而不是作为其替代品。

虽然return() 将停止函数执行并返回放入其中的值,但invisible() 不会做这样的事情。它只会让它的内容暂时不可见。

考虑以下两个例子:

f1 <- function(x){
  if( x > 0 ){
     invisible("bigger than 0")
  }else{
     return("negative number")
  }
  "something went wrong"
}

result <- f1(1)

result
## [1] "something went wrong"



f2 <- function(x){
  if( x > 0 ){
     return(invisible("bigger than 0"))
  }else{
     return("negative number")
  }
}

result <- f2(1)

result
## [1] "bigger than 0"

绕过invisible() 的陷阱后,我们可以看看它的工作原理:

f2(1)

由于使用了invisible(),该函数不打印其返回值。但是它确实像往常一样传递值

res <- f2(1)
res 
## [1] "bigger than 0"

invisible() 的用例是例如防止函数返回值会产生一页又一页的输出,或者当一个函数因其副作用而被调用并且返回值是例如仅用于提供更多信息...

【讨论】:

  • 来自其他编程语言,一旦我意识到 R 隐式打印了很多东西,它就更有意义了。我会认为这样的打印是一种副作用,而 invisible() 使它不会那样做。
【解决方案3】:

Tidyverse 设计指南书中的这段摘录解释了为什么返回一个不可见的值可能很有用。

如果调用一个函数主要是为了它的副作用,它应该 无形地返回一个有用的输出。如果没有明显的输出,返回 第一个论点。这使得可以将函数与 in 一起使用 管道。

https://design.tidyverse.org/out-invisible.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2014-05-23
    • 2017-06-19
    • 2020-06-06
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多