在if语句中,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]]) {

我对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]]) {
                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))