gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:24:30 26 4
gpt4 key购买 nike

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

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

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

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)

这将采用 channel 的第一个元素并将其传递到您的函数 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 在您当前的上下文中不起作用。

关于r - 在for循环R中使用下一个错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34386892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com