我正在尝试编写一个带有从数据框调用变量的参数的函数,我想知道为什么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
答案 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
。我怀疑是值得所有的大惊小怪。