为什么Linux版R中并行调用含for循环的函数返回NULL?
问题原因
R语言的语法规则中,for循环本身的返回值固定为NULL,而R函数默认会将函数体内最后一行执行的表达式的返回值,作为整个函数的返回值。
两种写法的差异如下:
- 最初的
for_test函数最后执行的语句是完整的for循环,因此整个函数的返回值就是for循环的返回值NULL,parLapply收集到的自然全是NULL。你在控制台看到的i*s打印内容只是print函数的副作用输出,不属于函数的返回值。 - 修改后的
for_test函数最后执行的语句是print(i*s),print函数的返回值就是其打印的目标对象,因此函数可以正常返回计算结果,parLapply就能拿到正确的返回值。
该问题和并行框架本身无关,直接串行执行lapply(rows, for_test)也会得到全NULL的结果,属于R基础语法的返回值规则问题。
修复方案
如果需要返回for循环内的计算结果,在函数内显式构造返回对象,最后主动返回即可,示例代码如下:
for_test <- function(i){ # 定义容器存储循环结果 res <- numeric(3) for (s in 1:3){ res[s] <- i * s print(res[s]) } # 最后一行放结果对象,R会自动将其作为返回值,也可以显式写return(res) res }
修改后执行parLapply即可得到每个迭代对应长度为3的计算结果向量。
内容的提问来源于stack exchange,提问作者tom91
相关产品推荐
相关产品推荐

