我的目标是对TRUE / FALSE进行编码,以评估通过粘贴三个字符单元格生成的字符串。以下是我所拥有的。
cond.var<-"a"
relation<-"!="
cond.value<-"1"
a<-1
as.numeric(eval(parse(text=paste(cond.var, relation, cond.value, sep=""))))
上面的代码在cond.value中存储数字时起作用。最后一行返回0,这是正确的。但是,当NA存储在cond.value中(cond.value <-“ NA”)时,最后一行仅返回NA,这是不正确的。
任何解决此问题的建议将不胜感激。谢谢。
答案 0 :(得分:0)
您可以使用另一个函数比较两个项目是否相同,例如identical()
:
> identical(1, 1)
TRUE
> identical(1, NA)
FALSE
> identical(1, 0)
FALSE
> identical(NA, NA)
TRUE
尽管这使relation
变量的通用性降低了。
因此,完整的解决方案是:
cond.var<-"a"
relation<-"!identical"
cond.value<-"1"
a<-1
as.numeric(eval(parse(text=paste0(relation, '(', cond.var, ',', cond.value, ')'))))
答案 1 :(得分:0)
很黑,但这无需更改设置即可工作
(使用magrittr
管道以提高可读性)
library(magrittr)
paste("`", relation, "`(", cond.var, ", ", cond.value, ")", sep="") %>%
sub(paste0(cond.var, ", NA)"), paste0("is.na(", cond.var, "), TRUE)"), .) %>%
parse(text=.) %>%
eval() %>%
as.numeric()
答案 2 :(得分:0)
您的问题的前提(a != NA
返回NA不正确)实际上是错误的。
NA实际上是“不可用”。不是TRUE
或FALSE
,但未知。因此,如果我问您,“未知值等于1吗?”您的答案很合理地是“未知”。对NA值进行的大多数逻辑运算(例如询问NA是否等于1)都会返回NA(有一些例外,例如另一个答案中提到的明显的is.na(NA)
或identical(NA, NA)
)。>
因此,如果将NA插入原始代码中:
cond.var<-"a"
relation<-"!="
cond.value<-"NA"
a<-1
as.numeric(eval(parse(text=paste(cond.var, relation, cond.value, sep=""))))
...最后一条命令实际上应该返回NA。您的代码可以正常工作。