eval разбирать символ в вызове функции r - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть внешний объект с символом класса:

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 напрямую передавались в функцию без явного указания, как в примере выше.

1 Ответ

4 голосов
/ 27 апреля 2019

Как правило, не рекомендуется оценивать / анализировать строки в R, если вы не уверены на 100%, что они безопасны.

Но вы можете динамически передавать аргументы в функции с 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() как обычно

...