【问题标题】:R evaluate character/string as the calling function nameR评估字符/字符串作为调用函数名
【发布时间】:2020-11-01 13:42:27
【问题描述】:

我有一个用例,我想将命令行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 来处理它,它很快就会变得乏味。

有没有办法,例如使用quosureeval 或类似的方法来替换此逻辑,这样我只需编写几行代码即可完成工作?

例如,理想的逻辑是,

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

我通过编写包装函数尝试了enquo,但它不起作用;我尝试了eval_tidy,但无济于事(代码无效。)

【问题讨论】:

    标签: r function tidyverse expression-evaluation


    【解决方案1】:

    如果我理解的话,你想使用第一个参数作为函数名吗?然后尝试以某种方式使用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.
    

    这有帮助吗?

    【讨论】:

    • 谢谢,这看起来很有希望,让我尽快试试,我会回复的。
    • 感谢您的解决方案确实有效!我不得不稍微调整我的代码以使其正常工作,但它符合我的目的
    猜你喜欢
    • 1970-01-01
    • 2021-05-21
    • 2018-10-03
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 2017-04-17
    • 1970-01-01
    相关资源
    最近更新 更多