我正在运行以下代码:
disc<-for (i in 1:33) {
m=n[i]
xbar<-sum(data[i,],na.rm=TRUE)/m
Sx <- sqrt(sum((data[i,]-xbar)^2,na.rm=TRUE)/(m-1))
Sx
i=i+1}
运行它:
>disc
NULL
为什么它给我NULL?
我正在运行以下代码:
disc<-for (i in 1:33) {
m=n[i]
xbar<-sum(data[i,],na.rm=TRUE)/m
Sx <- sqrt(sum((data[i,]-xbar)^2,na.rm=TRUE)/(m-1))
Sx
i=i+1}
运行它:
>disc
NULL
为什么它给我NULL?
这来自文档for
,可通过 以下方式访问?`for`
:
'for'、'while' 和 'repeat' 不可见地返回 'NULL'。
也许您正在寻找以下方面的内容:
library(plyr)
disc <- llply(1:33, function(i) {
m=n[i]
xbar<-sum(data[i,],na.rm=TRUE)/m
Sx <- sqrt(sum((data[i,]-xbar)^2,na.rm=TRUE)/(m-1))
Sx
})
存在其他变体—— ll
inllply
代表“列出,列出”。也许您想要的最终结果是一个数据框或一个数组——存在适当的函数。
上面的代码是您的示例的简单转换。我们可以通过立即拆分data
并忘记原本无用的计数变量i
(未经测试,因为您没有提供数据)来做得更好:
disc <- daply(cbind(data, n=n), .(), function(data.i) {
m=data.i$n
xbar<-sum(data.i,na.rm=TRUE)/m
sqrt(sum((data.i-xbar)^2,na.rm=TRUE)/(m-1))
})
相关(如果不是重复的):R - 如何将循环转换为 R 中的函数
krlmlr 的答案向您展示了如何修复您的代码,但用更抽象的术语解释您的原始问题: for 循环允许您多次运行同一段代码,但它不会为您存储运行该代码的结果- 你必须自己做。
Sx
您当前的代码实际上只为 for 循环的每次运行分配一个值 , 。在下一次运行时,将一个新值放入Sx
变量中,因此您将丢失所有以前的值。最后,您将Sx
得到最后一次循环运行时的值。
要保存 for 循环的结果,您通常需要在执行时将它们添加到向量中,例如
# Create the empty results vector outside the loop
results = numeric(0)
for (i in 1:10) {
current_result = 3 + i
results = c(results, current_result)
}
在 Rfor
中不能返回值。返回值的唯一方式是在函数内。所以这里的解决方案是将循环包装在一个函数中。例如:
getSx <- function(){
Sx <- 0
disc <- for (i in 1:33) {
m=n[i]
xbar <- sum(data[i,],na.rm=TRUE)/m
Sx <- sqrt(sum((data[i,]-xbar)^2,na.rm=TRUE)/(m-1))
}
Sx
}
然后你叫它:
getSx()
当然,您可以避免使用for
bylapply
或通过提供矢量化的副作用但这是另一个问题:您可能应该给出一个可重现的示例并解释一下您尝试计算的内容。