函数invisible()有什么作用?

时间:2012-07-25 15:22:53

标签: r

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()做了什么,它有用的地方,以及它在上面的方法打印函数中的作用是什么?

非常感谢你的帮助。

3 个答案:

答案 0 :(得分:28)

来自?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

的副本

如果您未使用invisible,如果未分配,也会打印x。例如:

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 

答案 1 :(得分:12)

虽然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()

{{1}}的用例例如是防止函数返回值,这些函数返回值会产生一页又一页的输出,或者当一个函数被调用它的副作用并且返回值例如是仅用于提供更多信息...

答案 2 :(得分:1)

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

<块引用>

如果一个函数主要是因为它的副作用而被调用,它应该 无形中返回一个有用的输出。如果没有明显的输出,则返回 第一个论点。这使得可以使用带有 in 的函数 一个管道。

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