R:将逗号分隔的字符串评估为表达式
R: evaluate comma-separated string as an expression
我有一个逗号分隔的字符串,我想将其作为逗号分隔的表达式插入到函数中。具体来说,有各种以...
为参数的函数,我想有一个方法将逗号分隔的字符串转换为逗号分隔的参数列表,可以将'injected'转换为...
函数调用中的参数。我尝试使用 parse
和 eval
,如 on this page 中提示的那样,但我仍然无法使我的功能正常工作。
下面是我正在尝试做的可重现示例。
这个很好用
a <- 1
b <- 2
sum(a, b)
如果 a
和 b
编码为字符串,我无法让它们在 sum
函数中求值
这失败了,因为 myString
是字符 class,并且该函数尝试按原样对其求值,而不是将其解析为组件 a
和 b
。
myString <- 'a, b'
sum(myString)
尝试使用 parse
和 eval
也失败了
这些给出关于意外逗号的错误。
sum(parse(text = myString))
sum(eval(parse(text = mystring)))
输出:
Error in parse(text = myString) : <text>:1:2: unexpected ','
1: a,
^
我必须在 myString
上使用什么函数或函数集 (fxn
) 才能使 sum
正确求值?
我想要的解决方案将采用以下格式,其中 fxn
是 sum
函数之前必须在 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
我有一个逗号分隔的字符串,我想将其作为逗号分隔的表达式插入到函数中。具体来说,有各种以...
为参数的函数,我想有一个方法将逗号分隔的字符串转换为逗号分隔的参数列表,可以将'injected'转换为...
函数调用中的参数。我尝试使用 parse
和 eval
,如 on this page 中提示的那样,但我仍然无法使我的功能正常工作。
下面是我正在尝试做的可重现示例。
这个很好用
a <- 1
b <- 2
sum(a, b)
如果 a
和 b
编码为字符串,我无法让它们在 sum
函数中求值
这失败了,因为 myString
是字符 class,并且该函数尝试按原样对其求值,而不是将其解析为组件 a
和 b
。
myString <- 'a, b'
sum(myString)
尝试使用 parse
和 eval
也失败了
这些给出关于意外逗号的错误。
sum(parse(text = myString))
sum(eval(parse(text = mystring)))
输出:
Error in parse(text = myString) : <text>:1:2: unexpected ','
1: a,
^
我必须在 myString
上使用什么函数或函数集 (fxn
) 才能使 sum
正确求值?
我想要的解决方案将采用以下格式,其中 fxn
是 sum
函数之前必须在 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