2013-07-16 144 views
0
沒有結果或錯誤

我運行下面的代碼: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?

+0

'n'是什麼?什麼是'數據'? – 2013-07-16 23:14:26

+0

當我不使用循環時,我必須一個接一個地運行它們。運行它們一個接一個,我得到Sx = 4.5,3.5,.... –

+0

Wait ....你爲什麼要試圖給一個變量分配一個'for'循環?我不確定這是一個有效的任務,即使是這樣,這也是一件非常奇怪的事情。 – 2013-07-16 23:18:43

回答

5

這是從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 
}) 

其它變體存在 - 的llllply代表「名單,列出了」。也許你想要的最終結果是數據框架或數組 - 存在適當的功能。

上面的代碼是您的示例的普通轉換。我們也許能夠做的分裂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

+0

啊,對不起。應該意識到你不會把它留在那裏。 – Marius

+0

這工作完美。但是,我在代碼中做錯了什麼? –

+0

@ayeshamalik:這只是因爲'for'不會返回任何內容,正如文檔所閱讀的內容一樣,而且我已經在我的答案的頂部指出了這一點。 – krlmlr

2

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) 
} 
+0

我明白了。這真的有幫助。刪除Sx在我的情況下完成這項工作。 非常感謝! –

+1

@ayeshamalik:爲了完整起見,上面代碼的'plyr'相當於:'results < - laply(10,function(i)3 + i)' – krlmlr

+0

@ayeshamalik:不,錯:結果< - (1:10,函數(i)3 + i)'是正確的版本。 – krlmlr

1

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的副作用,但是,這是另外一個問題:你也許應該給出一個可重複的例子,並解釋一下你試圖計算什麼。