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
 i=i+1}

运行它:

 >disc
 NULL

为什么它给我NULL?

4

3 回答 3

5

这来自文档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
})

存在其他变体—— llinllply代表“列出,列出”。也许您想要的最终结果是一个数据框或一个数组——存在适当的函数。

上面的代码是您的示例的简单转换。我们可以通过立即拆分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))
})

另请plyr参阅网站了解更多信息。

相关(如果不是重复的):R - 如何将循环转换为 R 中的函数

于 2013-07-16T23:16:12.483 回答
2

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)
}
于 2013-07-16T23:31:37.247 回答
1

在 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()

当然,您可以避免使用forbylapply或通过提供矢量化的副作用但这是另一个问题:您可能应该给出一个可重现的示例并解释一下您尝试计算的内容。

于 2013-07-17T00:53:17.170 回答