【问题标题】:How to delay the evaluation of function arguments in R?如何延迟 R 中函数参数的评估?
【发布时间】:2023-08-29 10:39:01
【问题描述】:

我想延迟 R 中函数参数的评估。示例:

my_func <- function(FUN){print(FUN); print(FUN)}
my_func(runif(1))
#> [1] 0.2833882
#> [1] 0.2833882

reprex package (v0.2.1) 于 2019 年 7 月 21 日创建

这是因为 runif(1) 只被评估一次并且它的结果被打印两次。

相反,我不希望在每个 print() 语句中之前评估 runif(1)。这将生成两个不同的随机数。

换句话说,我不希望 FUN “解决” --- 如果这是正确的词 --- 到 runif(1),直到我们在 print() 声明中。

【问题讨论】:

    标签: r rlang


    【解决方案1】:

    您也可以通过substituteeval 实现此目的:

    my_func <- function(FUN) {
      print(eval(substitute(FUN)))
      print(eval(substitute(FUN)))
    }
    
    my_func(runif(1))
    #> [1] 0.09973534
    #> [1] 0.8096205
    
    my_func(runif(1))
    #> [1] 0.2231202
    #> [1] 0.5386637
    

    注意:有关更多详细信息,请查看 Advanced R 的这一章 Non-standard evaluation

    【讨论】:

      【解决方案2】:

      这是match.calleval 的一个技巧

      my_func <- function(FUN){
        print(eval(match.call()[[2]])) 
        print(eval(match.call()[[2]]))
      }
      
      my_func(runif(1))
      
      #[1] 0.7439711
      #[1] 0.5011816
      
      my_func(runif(1))
      #[1] 0.7864152
      #[1] 0.730453
      

      【讨论】:

        【解决方案3】:

        提供和表达

        f = function(EXPR){
          print(EXPR)
          eval(EXPR)
        }
        
        EXPR = expression(runif(1))
        > f(EXPR)
        expression(runif(1))
        [1] 0.1761139
        

        提供一个字符串

        f2 = function(STR){
          print(STR)
          eval(parse(text = STR)) 
        }
        
        STR = "runif(1)"
        > f2(STR)
        [1] "runif(1)"
        [1] 0.7630865
        

        【讨论】:

          最近更新 更多