R:我有一个带有不可见 return 值的函数,我怎样才能对其进行矢量化而不得到巨大的空输出?

R: I have a function with an invisible return value, how can I vectorize it and not get a huge null output?

我写了一个相当简单的函数,我相信returns没什么:

bar<-function(a,b)
{
  if(foo(a,b)){print(c(a,b))}
  return(invisible())
}

我想在一个巨大的矩阵上调用这个函数,例如outer(1:100,1:100,Vectorize(bar))。这样做时,我得到了我想要的打印,但我也得到了一个巨大的 NULL 值数组的输出。我如何调整此代码以摆脱大量的 NULL 并且不丢失我想要的打印?

当您在 bar() 中调用副作用然后跳转到顶层时,就会发生这种情况。函数 bar() 完成副作用(打印)然后 return 将最终命令中的最后一个值发送到顶层。

无论 a 和 b 的大小如何,这种排列 return 都是一个 NULL。如...

a <- matrix(1:9,nrow=3,ncol=3)
b <- matrix(1:9,nrow=3,ncol=3,byrow=TRUE)

foo <- function(a,b) {
                      exists("a")
                      exists("b")
                     }

bar <- function(a,b) {
                      if(foo(a,b)) {print(c(a,b))}
                      NULL  # or equivalently: return()
                     }

x <- bar(a,b)  # x will be a single NULL

或者,您可以简单地在 bar() 中做您想完成的任何事情,return a 和 b 适当地然后使用 returned 值在函数外打印。在大多数情况下,这可能是一个更好的主意。此外,“<<-”运算符在这里也很有用,尽管全局变量除了这里的副作用之外还有它们自己的问题。