R оценивает символ / строку как имя вызывающей функции - PullRequest
0 голосов
/ 12 июля 2020

У меня был случай использования, когда я хотел оценить командную строку args как имена функций. Например,

r_script.R print --number 2

Я возьму пакет r docopt в качестве примера. Аргументы обычно индексируются по собственным именам, например, args$print относится к строковому значению "print". Фактический код R будет выглядеть так:

if (args$print){
   if (args$number){
       # call print()
       print(as.numeric(args$number))
   }
}

Когда у меня есть длинный список функций вроде print, я бы написал массивный if-else-loop, чтобы справиться с ним, и это быстро становится утомительным.

Есть ли способ, например, с помощью quosure, eval или подобных методов заменить этот logi c таким образом, чтобы я мог просто написать всего несколько строк кода, чтобы выполнить работу?

Например, идеальным logi c было бы,

func_enquo -> enquo(args$func)  # func is in place of `print`
func_enquo(value)  # what matters is the print argument here.

Я пробовал enquo, написав функцию-оболочку, и это не сработало; Я попробовал eval_tidy, но безрезультатно (код недействителен).

1 Ответ

1 голос
/ 12 июля 2020

Если я понимаю, вы хотите использовать первый аргумент в качестве имени функции? Затем попробуйте использовать get() как-нибудь:

do_something <- function(fct, arg) {
   get(fct)(arg)
}

do_something("print", "Hello")
#>[1] "Hello"

do_something("mean", 1:5)
#> 3

Обратите внимание, что вы должны быть осторожны с тем, во что вы переходите. Тогда вы можете ссылаться на аргумент как на args [1], а не как на args $ print, если он всегда первый, как-то так:

func_enquo -> get(args[1])  # func is in place of `print`
func_enquo(value)           # what matters is the print argument here.

Это помогает?

...