eval将字符解析为函数调用r

问题描述 投票:0回答:1

我有一个带有类字符的外部指定对象:

X = "c(Arg1 = 'First', Arg2 = 'Second', Arg3 = 'Third')"

我想直接插入R中的函数,就像foo(X)

以下是我想要做的一个例子:

Inputs <- eval(parse(text = X))

Msg_Foo <- function(Arg1, Arg2, Arg3) {
    message(paste(Arg1, Arg2, Arg3, sep = "\n"))
 }

Msg_Foo(
    Arg1 = Inputs["Arg1"], 
    Arg2 = Inputs["Arg2"],
    Arg3 = Inputs["Arg3"]
    )

但理想情况下,我想要一个只需要的解决方案:

Msg_Foo(Inputs)

这很重要,因为我想在函数中指定一个椭圆(...),以便X中的参数直接传递给函数,而不需要像上面的例子中那样进行显式指定。

r eval base
1个回答
4
投票

除非你100%确定它们是安全的,否则在R中评估/解析字符串通常不是一个好主意。

但您可以使用do.call()动态地将参数传递给函数。例如

# X = "c(Arg1 = 'First', Arg2 = 'Second', Arg3 = 'Third')"
# Inputs <- eval(parse(text = X))

Msg_Foo <- function(x) {
  message(do.call("paste", c(as.list(x), sep="\n")))
}    
Msg_Foo(Inputs)

您的输入是命名字符向量。我们需要将其转换为与do.call一起使用的命名列表,然后将它们传递给粘贴函数。然后我们正常将结果传递给message()函数

© www.soinside.com 2019 - 2024. All rights reserved.