在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
只能在循环中使用,例如while
和for
。那么让我们回到我们的 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
在您当前的上下文中不起作用。
我的 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
只能在循环中使用,例如while
和for
。那么让我们回到我们的 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
在您当前的上下文中不起作用。