在数据框中编写函数和调用变量R

时间:2015-06-18 15:25:32

标签: r

我正在尝试编写一个带有从数据框调用变量的参数的函数,我想知道为什么with()的使用在这个实例中不起作用?

#Data
N=100
p=2
d=data.frame(matrix(rbinom(N*p,1,.5),N,p))

#Trivial fxn 1
fxn1=function(var,data){
    # SELECT DATA
    data.new = data[with(data,var)==0,]
    return(data.new)}

fxn1(x1,d)   #doesn't work
fxn1(d$x1,d) # works

注1:我问过这个问题:What are the advantages of using with() vs. calling vectors?一段时间后,似乎这是with的完美用法(但显然不是)。

注意2:我也问了这个问题:Call variable from custom function并收到了一个有用的答案,这使我编写了这个有效的功能:

fxn2=function(var,data){
    data.new=data[data[[deparse(substitute(var))]]==0,]
    return (data.new)}

fxn2(x1,d) #works

2 个答案:

答案 0 :(得分:2)

不是纠缠于什么不起作用,而是完成你所想到的功能:

fxn1 = function(var,data) {
    # SELECT DATA
    data.new = data[data[[var]] == 0, ]
    return(data.new)
}

<强>用法:

d <- data.frame(matrix(rbinom(N*p,1,.5),N,p))
> names(d)
[1] "X1" "X2" "X3" "X4" "X5"
fxn1("X1", d)

答案 1 :(得分:1)

一般来说,我同意Tim Biegeleisen的观点,但如果你真的希望它能够发挥作用,你可以像这样使用as.symbol %>% eval

with(data, eval(as.symbol(var)))

否则您只需评估var。我怀疑是值得所有的大惊小怪。