将表达式作为r中的参数传递

时间:2018-10-16 17:16:29

标签: r function rlang

我正在努力理解将参数从函数传递到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')

但是,这些无效。无论如何,我是否需要同时传递字段+比较符号+值的组合?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这似乎对我有用。

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

custom_count(mtcars, quote(mpg > 10))