在for循环R中使用下一个错误

Error using next in for loop R

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

Error in FUN(X[[i]], ...) : no loop for break/next, jumping to top level

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)  
}  

频道数据
频道六月七月十二月
提款机 666 783 333
签证 893 321 321
借方 931 134 123
商家 913 111 134

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

test <- lapply(channnel, autoAnal)   

我的 for 循环中的 'next' 语句有什么问题?

谢谢。

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

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

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

test <- lapply(channnel, autoAnal)

这将获取 channnel 的第一个元素并将其传递给您的函数 autoAnal。此时,代码从 lapply is 运行ning 的循环切换到单个函数调用。函数做的第一件事是检查传递给函数的元素是否为数字。如果不是,则使用 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 仅用于循环。

在我看来,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 语句一起删除。如果没有值 returned,lapply 自然会 return NULL,并且函数将完全跳过第一个变量的所有代码,因为它不是数字。最后,您得到了一个仅对数字数据进行操作的无错误函数。

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