2016-11-26 55 views
-1

在這段代碼:爲什麼這個if/else錯誤出現在腳本中而不是在控制檯中?

q7 <- function (x) { 
    if (is.numeric (x) == FALSE) {stop ("Input is non-numeric.")} 
    if (all (x > 0) == FALSE) {stop ("Input has negative values.")} 
    sum <- 0 
    while (sum <= 100) { 
    if (x[1] > 50) {next} 
    else if (x[1] %% 2 == 0) {sum <- sum + (x[1]/2)} 
    else {sum <- sum + x[1]} 
    x <- x [x[2]:length (x)] 
    } 
} 

例如用作q7 (c(10,20,30,40,50,60,70,80,90,100)),我得到這個錯誤:

Error in if (x[1] > 50) { : missing value where TRUE/FALSE needed 

我認爲這裏的條件簡單得不能再簡單,我必須失去了一些[R啓發式,因爲顯然在控制檯;

> x <- c(10,20,30,40,50,60,70,80,90,100) 
> x[1] > 50 
[1] FALSE 

那麼簡單。
這是怎麼回事?

+0

我想在每個迭代中省略'x'中的第一個值,是否有辦法不會搞砸一切? –

+0

當然,這避開了我。謝謝! –

回答

0

快速診斷與debug示出了該問題與

x <- x[x[2]:length(x)] 

在第一次迭代後,這將是NA的載體。然後在下一次迭代中,當您檢查x[1] > 50時,您實際上在做NA > 50,因此您會收到錯誤。

與您覈對之後,您只需要刪除第一個值x。那麼爲什麼不使用

x <- x[-1] 
0

更改x [2]爲2將做到這一點。

x <- x [2:length (x)] 

由於「下一個」語句你將最終獲得一個無限循環的,由於從X [1] = 60以後,將保持移動到while循環(永遠)的下一次迭代。也許你想用'break'。

相關問題