R语言 dplyr传递参数

dplyr传递参数

dplyr可以算得上是R语言的神器了,各种流式操作,让人爱不释手。

dplyr 可以直接根据列名进行操作,也就是所谓的(Non-standard evaluation)这方便很多,同样也给我们自定义函数时的参数传递带来了麻烦。

非标准化求值 Non-standard evaluation NSE

只有了解了NSE的原理,才会了解一些函数的写法,方便我们传递参数.

可以参考
http://blog.csdn.net/tanzuozhev/article/details/50603507

require(dplyr)

df <- data.frame(col1=c(1:3), col2=letters[1:3], col3=LETTERS[4:6])

# 我们可以采用...的方式来传值
f <- function(data, ...) {
  data %>% select(...)
}

f(df, col1, col2)
## col1 col2
## 1 1 a
## 2 2 b
## 3 3 c

我们可以采用…的方式来传值,这样比较简便,但是当使用比较复制的函数时存在一定的局限性.
dplyr包的每一个NSE函数都配有一个SE函数,以下划线_作为结尾,比如
select的SE函数为 select_
filter的SE函数为 filter_
SE函数可以接受 substitute 返回的 call 类变量
NSE函数的实质其实是嵌套SE函数
可以参考
http://blog.csdn.net/tanzuozhev/article/details/50603507
以 filter为例

# 下面的函数为个人理解
filter <- function(df, expression){
  filter_(df, substitute(expression))
}

所以传递参数可以这样使用
substitute的使用可以参考
http://blog.csdn.net/tanzuozhev/article/details/50603045

df <- data.frame(col1=c(1:3), col2=letters[1:3], col3=LETTERS[4:6])
fun1 <- function(x, col_name, value){
 x %>% 
  filter_(substitute(x<y, list(x=as.name(col_name), y=value)))
}
fun1(df, 'col1', 2)
## col1 col2 col3
## 1 1 a D

你可能感兴趣的:(R语言,nse,dplyr)