可能的嵌套ifelse语句数量是否有限制?

21

我写了一段使用了75个(!!!)嵌套ifelse语句的代码。

我知道这可能是我能写的最低效的代码,但当我尝试运行它时,收到了以下错误:

>Error: unexpected ')' in:
"                                 ifelse(basic$SEMType=="ppc" &
 (grepl("Wellpoint Prospecting",basic$CategoryName)), "Wellpoint Prospecting","other"
                                     )))))))))))))))))))))))))))))))))))))"

我检查了几次“)”的数量。它是正确的,ifelse也关闭了。

我也尝试分块运行嵌套的ifelse,每次15个(有时更大的块),它可以工作,所以我认为语法错误的机会很小。

有人遇到过这样的限制吗?

现在我逐段运行代码,首先运行内部的ifelse并记录结果,然后向上移动通道。到目前为止,这似乎有效。


3
你想用这么多嵌套的ifelse语句做什么? - Dason
6
我不知道是否有限制,但您不需要使用 ifelse 语句。只需创建一个向量 group.id <- rep(NA, nrow(basic)),并分配类似于 group.id[basic$SEMType=="ppc" & grepl("Wellpoint Prospecting",basic$CategoryName)] <- "Wellpoint Prospecting" 的值给它,诸如此类。这样,每个 ifelse 语句都被替换为一个赋值语句,从而导致更清晰的代码(很可能您还可以编写一个函数来进一步简化这些赋值语句,但如果没有查看您的代码就无法确定)。 - konvas
1
警告:ifelse非常缓慢。嵌套它们会有指数级的缓慢风险。请参见此处:https://dev59.com/fGQo5IYBdhLWcg3wKcrH#16275201 - Ricardo Saporta
3
同时,该错误可能是由于缺少闭引号出现两次所致。 - Ricardo Saporta
2
当我遇到两个嵌套的ifelse时,我的代码阅读能力会迅速降至0。我真的建议将你想要实现的(小)示例作为一个单独的问题发布,因为你做得不对。 - eddi
显示剩余2条评论
1个回答

25

至少用这种方法,我似乎最多可以创建50个嵌套级别

x<-"NA"
for(i in 1:50) {
    x<-paste0("ifelse(x==",i,",",i,",", x, ")")
}
x
eval(parse(text=x), list2env(list(x=21)))

但是如果我尝试使用51,我会收到错误提示

Error in parse(text = x) : contextstack overflow at line 1

也许这是特定于解析的。你得到语法错误似乎有些奇怪。

感谢@shadow提供的链接,Brian Ripley在 r-help 的一个问题中在2008年回答确认了这一点。

在这种特殊情况下[contextstack overflow],它会指出您有超过50个嵌套的解析上下文

@Spacedman在 R 源代码的定义限制的位置发现了这一点。

#define CONTEXTSTACK_SIZE 50

1
如果我手动复制并粘贴x用于1:51,我会得到相同的错误。 - Señor O
2
如果将其放到文件中的函数定义中并“源化”,则会出现相同的错误。即使跨越多行,长度超过51层嵌套,我仍然会在第51行上出现错误。 - Spacedman
3
根据Brian Ripley的说法(https://stat.ethz.ch/pipermail/r-help/2008-March/157341.html),你最多可以有50个嵌套的解析上下文。 - shadow
2
这是代码中的位置:https://github.com/wch/r-source/blob/c48b62e3b4dd43d939e21f4af87e877151f1840b/src/main/gram.y#L1158 - Spacedman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接