在if语句中,R参数的长度为零
我对R有点问题,我不知道为什么。它告诉我这一行:在if语句中,R参数的长度为零,r,R,我对R有点问题,我不知道为什么。它告诉我这一行:if(temp>data[[k]][[k2]]){的参数长度为0。下面是一个没有那么大的块: for(k in 1:length(data)) { temp <- 0 for(k2 in 3:length(data[[k]])) { print(data[[k]][[k2]]) if(temp > data[[k]][[k2]]) {
if(temp>data[[k]][[k2]]){
的参数长度为0。下面是一个没有那么大的块:
for(k in 1:length(data)) {
temp <- 0
for(k2 in 3:length(data[[k]])) {
print(data[[k]][[k2]])
if(temp > data[[k]][[k2]]) {
temp <- data[[k]][[k2]]
}
fMax[k] <- temp
k2 <- k2 + 1
}
k <- k + 1
}
谢谢-Sam“参数长度为零”是一个非常具体的问题,它来自我最不喜欢的R元素之一。让我来演示这个问题:
> FALSE == "turnip"
[1] FALSE
> TRUE == "turnip"
[1] FALSE
> NA == "turnip"
[1] NA
> NULL == "turnip"
logical(0)
如您所见,与NULL的比较不仅不会产生布尔值,而且根本不会产生值——控制流倾向于期望检查将产生某种输出。当它们产生长度为零的输出时……”参数的长度为零
(我有一个很长的咆哮,为什么这让我如此愤怒。它可以等待。)
那么,我的问题是,sum(is.null(data[[k]])
的输出是什么?如果不是0,则数据集中嵌入了null值,需要删除相关行,或者将检查更改为
if(!is.null(data[[k]][[k2]]) & temp > data[[k]][[k2]]){
#do stuff
}
希望这会有帮助;如果没有整个数据集,很难判断。如果没有帮助,而且问题不是空值进入某个位置,恐怕我不知道。相同的错误消息不仅会导致
NULL
,还会导致例如因子(0)
。在这种情况下,查询必须是If(length(element)如果(!is.null(element)&length(element)>0&otherCondition)
,则最好使用检查这两种情况当您将输出作为长度为0的整数而不是空输出时,将发生长度为零的参数。即。,
整数(0)
您可以通过查找输出的类来进一步验证我的观点-
>类(输出)
“整数”我花了整整一天的时间来抨击这个问题,结果证明解决办法很简单
R不是零指数
我以前使用过的每种编程语言的数据都从0开始,R从1开始。
结果是一个由一个错误关闭,但在通常的相反方向。
数据结构上的越界返回null,如果在if语句中比较null,则该参数的长度为零。开始混淆是因为数据集不包含任何null,并且像任何其他编程语言一样从位置[0]开始,结果是越界的
也许从1开始对没有编程经验的人(R的目标市场?)更有意义,但如果你不知道这一点,对程序员来说是一个真正的难题。你可以在这种情况下使用isTRUE
。isTRUE
与{is.logical(x)&&length(x)=1&&!is.na(x)&&x}
如果您使用shiny there,您可以使用isTruthy
,它涵盖以下情况:
- 假的
- 空的
- “”
- 空的原子矢量
- 仅包含缺失值的原子向量
- 包含所有假值或缺失值的逻辑向量
- 类“try error”的对象
- 表示未单击的actionButton()的值
解决此问题的最简单方法是更改for循环语句:
而不是使用
for (i in **0**:n))
使用
我尝试了一点复制,但无法。请尝试设置选项(error=recover)
在遇到错误时将您转储到浏览器中。然后打印k
和k2
并仔细查看给您带来麻烦的案例。您确实应该发布一个示例输入和所需输出,可以复制/粘贴到R中。此外,请描述您正在尝试执行的操作,而不仅仅是发布损坏的代码;可能会出现错误很好,这是一个更好的方法。但是你的代码有一个for
循环k2
,并且手动增加值,这是非常奇怪的。好吧,我把它作为一个答案,有一个很好的解释,如果它让我困惑,尽管我不是最擅长解释的。你不需要手动增加for
循环,所以摆脱x的好评论!我敢打赌这就是问题所在(参见我关于空值的长篇大论)。或者,看看代码:你都在循环使用“for”和递增。结果可能是你最终会引用数据的索引[[k]]这是不存在的。要么使用for循环,要么用while循环递增,而不是两者都使用;for循环本身递增。nice one@ben_说;nchar(字符(0))
,它不是零,而是整数(0),这是一个令人讨厌的问题!注意:将第二个代码块中的&
替换为&
。R的&
运算符不会短路,因此建议的方法失败的原因与OP中的相同。这是一个多么漂亮的方法!
for (i in **0**:n))
for (i in **1**:n))