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 值在函数外打印。在大多数情况下,这可能是一个更好的主意。此外,“<<-”运算符在这里也很有用,尽管全局变量除了这里的副作用之外还有它们自己的问题。
我写了一个相当简单的函数,我相信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 值在函数外打印。在大多数情况下,这可能是一个更好的主意。此外,“<<-”运算符在这里也很有用,尽管全局变量除了这里的副作用之外还有它们自己的问题。