【问题标题】:passing in expression as an argument in r将表达式作为参数传入 r
【发布时间】:2023-06-01 00:45:01
【问题描述】:

我很难理解将参数从函数传递到 R 函数的问题。我通常可以通过 !!rlang::sym(argument) 让它正常工作。

我想要做的是创建一个函数,让我可以自定义数据集中的哪一列,我想对给定的比较计算计数。

例如,我可能想要计算等于 9999 或大于 5 或​​小于或等于 5 的值的数量。此列也可以更改。

custom_count=function(dataset, expr){

  result=dataset %>% summarise( sum( !!rlang::sym(expr), na.rm = TRUE)) 
  return(result)
}

custom_count(mtcars, 'mpg > 10')
custom_count( mtcars, 'vs==0')

但是,这些不起作用。无论如何我可以同时传递字段+比较符号+值的组合吗?

【问题讨论】:

    标签: r function rlang


    【解决方案1】:

    您想使用enexpr,因为您传递的是表达式,而不是符号:

    library(dplyr)
    custom_count=function(dataset, expr){
      result=dataset %>% summarise( sum( !!rlang::enexpr(expr), na.rm = TRUE)) 
      return(result)
    }
    
    custom_count(mtcars, mpg > 10)
    #   sum(mpg > 10, na.rm = TRUE)
    # 1                          32
    custom_count( mtcars, vs==0)
    #   sum(vs == 0, na.rm = TRUE)
    # 1                         18
    

    【讨论】:

    • @runningbirds 要回答有关使用指定为字符串的表达式的问题,请在此答案中将 rlang::enexpr 替换为 rlang::parse_expr。然后你应该能够做到custom_count( mtcars, "mpg > 10" )
    【解决方案2】:

    这似乎对我有用。

    custom_count=function(dataset, expr){      
      result=dataset %>% summarise( sum( !!expr, na.rm = TRUE)) 
      return(result)
    }
    
    custom_count(mtcars, quote(mpg > 10))
    

    【讨论】:

    • 这很好,但是当我想将 expr 值作为字符串传递时,等效的过程是什么...“mpg > 10”而不是这种方式?