我運行下面的代碼:FOR循環給R中
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循環給R中
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`
:
「爲」,「而」和「重複」迴歸「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
在llply
代表「名單,列出了」。也許你想要的最終結果是數據框架或數組 - 存在適當的功能。
上面的代碼是您的示例的普通轉換。我們也許能夠做的分裂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))
})
又見the plyr
website以獲取更多信息。
相關(如果不是一式兩份):R - How to turn a loop to a function in R
krlmlr的回答表明,你如何解決你的代碼,但在更抽象的術語來解釋你原來的問題:一個for循環允許您運行的同一段代碼多次,但它不存儲運行該代碼的結果 - 你必須自己做。
您當前的代碼僅爲for循環的每次運行確實分配一個值,即Sx
。在下一次運行中,一個新值將被放入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)
}
R for
無法返回值。返回值的唯一方式是在一個函數內。所以這裏的解決方案是將你的循環包裝在一個函數中。例如:
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()
當然你也可以通過lapply
或給出一個量化避免使用for
的副作用,但是,這是另外一個問題:你也許應該給出一個可重複的例子,並解釋一下你試圖計算什麼。
'n'是什麼?什麼是'數據'? – 2013-07-16 23:14:26
當我不使用循環時,我必須一個接一個地運行它們。運行它們一個接一個,我得到Sx = 4.5,3.5,.... –
Wait ....你爲什麼要試圖給一個變量分配一個'for'循環?我不確定這是一個有效的任務,即使是這樣,這也是一件非常奇怪的事情。 – 2013-07-16 23:18:43