R:将逗号分隔的字符串评估为表达式

R: evaluate comma-separated string as an expression

我有一个逗号分隔的字符串,我想将其作为逗号分隔的表达式插入到函数中。具体来说,有各种以...为参数的函数,我想有一个方法将逗号分隔的字符串转换为逗号分隔的参数列表,可以将'injected'转换为... 函数调用中的参数。我尝试使用 parseeval,如 on this page 中提示的那样,但我仍然无法使我的功能正常工作。

下面是我正在尝试做的可重现示例。

这个很好用

a <- 1
b <- 2
sum(a, b)

如果 ab 编码为字符串,我无法让它们在 sum 函数中求值

这失败了,因为 myString 是字符 class,并且该函数尝试按原样对其求值,而不是将其解析为组件 ab

myString <- 'a, b'
sum(myString)

尝试使用 parseeval 也失败了

这些给出关于意外逗号的错误。

sum(parse(text = myString))
sum(eval(parse(text = mystring)))

输出:

Error in parse(text = myString) : <text>:1:2: unexpected ','
1: a,
     ^

我必须在 myString 上使用什么函数或函数集 (fxn) 才能使 sum 正确求值?

我想要的解决方案将采用以下格式,其中 fxnsum 函数之前必须在 myString 上使用的函数:

# Acceptable solution format
sum(fxn(myString))

# Alternatively by piping
myString %>%
    fxn %>%
    sum

更新:

如果 myString 中编码的值不止两个,解决方案必须具有足够的泛化能力来处理。例如,解决方案也必须在以下情况下有效:

c <- 3
d <- 4
e <- 5
myString2 <- 'c, d, e'

# This:
sum(fxn(myString2))

# Must yield `12`

此外,结果应该具有足够的泛化性以适用于以 ... 作为参数的各种函数,而不仅仅是 sum。为简单起见,我选择 sum 作为示例。但是,下面是所需行为的另一个示例:

f <- 6
g <- 7
myString3 <- 'f, g'

# This:
prod(fxn(myString3))

# Must yield `42`

我认为解决方案是使用 strsplit,然后通过 sapply() 获取 () 每个值。

a <- 1
b <- 2
c <- 3
d <- 4
myString <- 'a, b, c, d'

fxn <- function(myString) 
{
  values <- unlist(strsplit(myString, split = ", "))
  sapply(values, function(x){get(x)})
}
sum(fxn(myString))

[1] 10