2016-11-26 51 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'。

相关问题