R Ifelse函数

R Ifelse函数,r,if-statement,R,If Statement,我正在尝试执行此代码,但得到的结果是NA > node1<- paste0("train$", rule, collapse=" & ") > node1 [1] "train$feat_11< 5.477 & train$feat_60< 4.687" >x<-ifelse(node1,1,0) [1] NA >节点1节点1 [1] “训练$feat_11[1] “逻辑的” xa 1和0的列表 尽管如此,您的ifelse语句是多余的

我正在尝试执行此代码,但得到的结果是NA

> node1<- paste0("train$", rule, collapse=" & ")
> node1
[1] "train$feat_11< 5.477 & train$feat_60< 4.687"
>x<-ifelse(node1,1,0)
[1] NA
>节点1节点1
[1] “训练$feat_11<5.477和训练$feat_60<4.687”

>逻辑向量和字符向量在R中是两个截然不同的东西

class(node1)
#>[1] "character"
您必须首先解析和计算字符串

lNode1 = eval(parse(text=node1))
class(lNode1)
#>[1] "logical"
x<-ifelse(lNode1,1,0)
#>a list of 1's and 0's
lNode1=eval(解析(text=node1))
类别(编号1)
#>[1] “逻辑的”
xa 1和0的列表

尽管如此,您的
ifelse
语句是多余的。当以需要的方式使用时,逻辑向量将强制为整数向量。例如,您可以
sum(lNode1)
并获得通过这两条规则的次数。

您必须首先计算此表达式。请注意,这不是一个好的R代码。R有更好的动态评估工具,如
公式
。构造并随后解析字符串几乎总是最不吸引人的解决方案。@KonradRudolph我以前多次看到过这种观点(尽管我仍然不明白为什么)——但在这里,我不知道如何将字符串转换为代码,作为逻辑向量进行计算。此外,
as.formula(node1)
返回:
formula.default(eval(parse(text=x)[[1L]])中的错误:无效的公式
,这表明
formula
eval(parse(text=node1))
-那么这段错误代码是什么呢?@标记您不会首先使用字符串,将
公式
或类似公式传递到函数中。毕竟,例如
lm
就是这样做的。至于为什么不好,有很多原因。最重要的是,如果用户输入最终可能出现在字符串中,那么解析和评估字符串总是会带来安全风险。这也是低效的。它还破坏了类型系统(但无论如何,在R中这是非常脆弱的)——aka。“严格类型代码”。但更根本的是,这只是一个概念上错综复杂的解决方案,因为它需要一个巨大的迂回过程。@KonradRudolph那么你将如何解决这个问题呢?我很乐意修改我的答案,使之包含好的R代码(并在这个过程中学习自己)。@Mark不知道更多关于OP的用例,我们不能,这就是为什么我写评论而不是答案的原因。你的答案是我们能做的最好的,我只是建议OP的方法几乎肯定是次优的。