【问题标题】:Error using next in for loop R在for循环R中使用next时出错
【发布时间】:2016-03-27 00:12:37
【问题描述】:

我的 For 循环中不断出现此错误:

FUN(X[[i]], ...) 中的错误:break/next 没有循环,跳转到顶层

autoAnal <- function(x){  
    if(!is.numeric(x)){  
        next  
    }  
    m <- median(x, na.rm = T)  
    a <- mean(x, na.rm = T)  
    s <- sd(x, na.rm = T)  
    q <- quantile(x, na.rm = T)  
    q3 <- q[4]  
    q1 <- q[2]  
    outhigh <- (1.5 * q3) + IQR(x, na.rm = T)  
    outlow <- (1.5 * q1) - IQR(x, na.rm = T)    
    data.table(Median = m, Average = a, StDev = s,   
    Outhigh = outhigh, Outlow = outlow)  
}  

频道数据
频道 六月 七月 十二月
ATM 666 783 333
签证 893 321 321
借记卡 931 134 123
商家 913 111 134

第一个变量 - “通道”不是数字,所以我希望 R 跳过并转到下一个变量。但是,我收到上面的错误。我可以在数值向量上成功运行该函数,但是当我使用数据框或 data.table 时 它不起作用。 当我运行这段代码时,我得到了错误:

test <- lapply(channnel, autoAnal)   

我的 for 循环中的“下一个”语句做错了什么?

谢谢。

【问题讨论】:

  • 您的代码中没有 for 循环。至少不是你认为有的地方。将next 替换为return(NULL) 就可以了。
  • @brittenb 你能解释下为什么下一个函数不起作用吗?

标签: r for-loop next


【解决方案1】:

为了了解为什么next 不起作用,我们必须分解您尝试过的代码的两个部分。为此,向后工作并检查lapply 的工作原理更有意义。让我们从一个名为 i 的基本变量开始,并将其设置为数字 1 到 10。一旦我们有了它,我们将使用 lapply 来查看函数如何处理输入向量。

i <- 1:10
tmp <- lapply(i, as.character)

如果您运行该代码并查看tmp,您会看到我们得到一个包含 10 个元素的列表,其中列表中的每个元素都是存储为字符串的单个数字。这应该向您展示lapply 作为一个循环,遍历您传递给它的对象的每个元素,并将其输入到您选择的任何函数中。所以让我们用它来看看你的代码在做什么。

test <- lapply(channnel, autoAnal)

这将获取channnel 的第一个元素并将其传递给您的函数autoAnal。此时,代码从lapply 正在运行的循环中切换并进入单个函数调用。您的函数所做的第一件事是检查已传递给函数的元素是否为数字。如果不是,则使用next 告诉R 跳过该变量。

但是,next 仅适用于循环,例如 whilefor。所以让我们回到我们的i 变量。假设我们想要循环 i 并在数字为偶数时打印一条消息,否则跳到下一个数字。我们可以这样做:

for (i in 1:10) {
  if (i %% 2 == 0) {
    print("i is even!")
  } else {
    next
  }
}

在这种情况下,使用next 不会引发错误,因为它是在for 循环中使用的。这就是为什么在我的评论中我提到没有for 循环,至少不是你认为有的地方。我这么说的目的是要指出,是的,lapply 是一个循环,但不是为了你想用next 做什么。

那么,如果我们只是尝试将 next 与 if 语句一起使用呢?

i <- 5
if (i %% 2 == 0) {
  print("i is even")
} else {
  next
}

这将引发错误,因为您的代码不是循环。它只会进行一次交互,其中涉及检查i 是否为偶数,然后继续。就像next 在这里不起作用一样,它在您的代码中不起作用,因为if 语句只是检查传递给它的元素是否是数字。如果这有意义的话,它没有什么可以“下一个”。因此,next 仅用于循环。

在我看来,next 甚至根本不需要。如果需要,您始终可以使用 if/else 语句来运行代码,或者忽略该变量。例如,让我们重写您的代码以利用 if/else 并摆脱我们的 next 调用。

autoAnal <- function(x){  
  if(is.numeric(x)){  
    m <- median(x, na.rm = T)  
    a <- mean(x, na.rm = T)  
    s <- sd(x, na.rm = T)  
    q <- quantile(x, na.rm = T)  
    q3 <- q[4]  
    q1 <- q[2]  
    outhigh <- (1.5 * q3) + IQR(x, na.rm = T)  
    outlow <- (1.5 * q1) - IQR(x, na.rm = T)    
    data.table(Median = m, Average = a, StDev = s,   
    Outhigh = outhigh, Outlow = outlow)
  } else {
    print("Skipping this element")
  }
}  

通过使用if/else,我们告诉计算机仅对数字变量执行这些计算。否则,打印一条消息说我们正在跳过一个变量。在普通代码中,我建议将 else 语句全部删除。如果没有返回值,lapply 自然会返回NULL,并且该函数将完全跳过第一个变量的所有代码,因为它不是数字。最后,您将得到一个只对数字数据进行操作的无错误函数。

希望这有助于说明为什么 next 在您当前的环境中不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2016-07-26
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多