问题 将字符类型转换为逻辑


我正在尝试为不熟悉R的人创建一些非常用户友好的代码。代码的设计使得逻辑标准可以根据用户的需求轻松操作。因此,我不想强​​迫用户在if语句中工作,而是想创建一个包含代码顶部逻辑语句的字符变量(即 x <- "a > 2")。

然后我想使用包含逻辑运算符的字符变量来评估if语句。这是基本的想法:

a <- 3
x <- "a > 2"
if(x)TRUE

这显然会返回一个错误,该参数不能被解释为逻辑错误,因为它将x视为字符串“a> 2”。

我知道我可以做到:

a <- 3
x <- as.logical(a > 2)
if(x)TRUE

但是,在我正在处理的情况下,最好将这些逻辑语句初始存储为字符。 as.logical()似乎无法转换字符(即 as.logical("a > 2"))不起作用。

我的问题:是否有一些我可以放x的函数允许R不是作为一个字符来查看它,而是作为一个逻辑语句?换句话说,我怎样才能删除引号,以便逻辑语句可以在if语句中工作?


7177
2017-07-23 14:24


起源

“我正在尝试为那些不熟悉R的人创建一些非常用户友好的代码。” - 有些人可能会说这是不可能的 签署了一个喜欢R的人,尽管它的语法很糟糕 - msw
你想在多大程度上将用户与R隔离开来?如果您的用户对“'&'表示AND”这样的事情感到不舒服,那么输入是字符串还是声明并不重要。您是否试图让用户轻松编辑功能或为功能提供输入?基本上,我认为任何能够理解如何构建逻辑测试的人都会如此 if y>2*z .OR. (y< x .AND. y < z/3)   可以很容易地学习R语法。 - Carl Witthoft
我的目标不是远离R语法。我在整个代码中有很多if语句,它们在开始时依赖于一些简单的标准输入。我只是想让用户快速轻松地自行更改初始标准输入,而无需搜索代码。将所有内容作为字符输入保留在开头允许我将逻辑语句的每个方面分开。用户首先选择要查看的参数,应用于每个参数的逻辑运算符(==,>,<...)以及数值。然后我可以连接。 - sph21


答案:


您可以使用 eval(parse(...))

a <- 3
x <- "a > 2"

eval(parse(text=x))
[1] TRUE

x2 <- "a==3"
eval(parse(text=x))
[1] TRUE

这里是龙

例如,见:


11
2017-07-23 14:30



谢谢。这有效,但我不确定我知道你指的是什么龙。 - sph21
我添加了一些相关问题的链接。我个人避免 eval(parse(...))如果我能。 - Andrie
谢谢。我一定会小心翼翼。 - sph21