如何知道函数是否无形地返回值?

时间:2014-09-16 11:28:08

标签: r

考虑以下功能

f1 <- function(x) {
  # do something
  x
}

f2 <- function(x) {
  # do something
  invisible(x)
}

假设我分别调用这两个函数并保存它们的值。

a <- f1(1)
b <- f2(2)

有没有办法知道ab是否被无形归还?

我的动机是我要创建一个函数,如果一个值被无形地返回,函数也想要隐形地返回值。

2 个答案:

答案 0 :(得分:8)

withVisible,可让您这样做:

> f3 = function(f, x){
   v=withVisible(f(x))
   if(v$visible){
     return(v$value)
      }else{
     return(invisible(v$value))
      }
   }
> f3(f1,1)
[1] 1
> f3(f2,1)

一旦你有ab,就无法做到这一点,因为identical(a,b)TRUE。您只能在表达式上调用withVisible。除非发生懒惰或妄想。

答案 1 :(得分:2)

Spacedman(适当的:-))解决方案的另一种可能替代方案是将以下行放入你的&#34;外部&#34;功能

if (grepl('invisible', body(inner_function) ) ) return(invisible(data)) else return(data)

显然,如果你做了一些创造性的事情,例如命名变量&#34; pinvisible&#34;