如何评估data.frame中的调用?
在我正在开发的一个软件包中,我遇到了一个看似简单的问题,但我无法解决: 子函数有两个参数:如何评估data.frame中的调用?,r,dataframe,R,Dataframe,在我正在开发的一个软件包中,我遇到了一个看似简单的问题,但我无法解决: 子函数有两个参数: obj,一个data.frame foo,一个呼叫 例如: > head(obj) cadmium copper lead zinc elev 1 11.7 85 299 1022 7.909 2 8.6 81 277 1141 6.983 3 6.5 68 199 640 7.800 4 2.6 81 116 25
,一个obj
data.frame
,一个foo
呼叫
> head(obj)
cadmium copper lead zinc elev
1 11.7 85 299 1022 7.909
2 8.6 81 277 1141 6.983
3 6.5 68 199 640 7.800
4 2.6 81 116 257 7.655
5 2.8 48 117 269 7.480
6 3.0 61 137 281 7.791
> foo
log(cadmium)
> class(foo)
[1] "call"
在该示例中,我想创建一个向量
x,看起来您没有正确定义函数:
> foo <- function(x) log(x)
> class(foo)
[1] "function"
>foo类(foo)
[1] “功能”
然后做:
x <- foo(obj$cadmium)
x您需要评估调用,例如使用eval()
:
其中,obj
是您显示的数据片段
eval()
还有一个envir
参数,指示表达式的计算环境。因此,您可以直接使用eval()
而不用with()
来做您想做的事情:
> eval(foo, envir = obj)
[1] 2.4595888 2.1517622 1.8718022 0.9555114 1.0296194 1.0986123
差不多
z <- data.frame(a1=1:5,b1=LETTERS[1:5],c1=letters[1:5])
foo <- quote(log(a1))
eval(foo,envir=z)
z对不起,我可能给的细节太少了。我正在使用的函数可以接受调用。例如,如果我想绘制从obj
data.frame的cd
列访问的镉值的对数,我希望用户能够使用以下Syntax(灵感来自ggplot2
):my_函数(obj,colors=log(镉)
。你的Q不完整-你需要展示foo
是如何创建的;我不得不在我的答案中猜测一些东西。正确的观点。我添加了一些细节。希望现在更容易理解。你真的很喜欢使用!我建议你阅读with.default
,这样你就可以直接操作了。@hadley你是说使用eval(substitute(foo),obj,enclose=parent.frame())
直接使用?有什么动机吗?@hadley公平地说,with()
这里是OP要求的用法,然后我简化为直接使用eval()
。但是,是的,我确实喜欢with()
,虽然不是针对这样的事情……是的,foo
是函数的参数,因此执行with()
所做的操作将节省额外的函数调用。您不需要指定include
。
x <- foo(obj$cadmium)
x <- foo(obj[["cadmium"]])
x <- with(obj, foo(cadmium)
foo <- call("log", quote(cadmium))
with(obj, eval(foo))
> with(obj, eval(foo))
[1] 2.4595888 2.1517622 1.8718022 0.9555114 1.0296194 1.0986123
> eval(foo, envir = obj)
[1] 2.4595888 2.1517622 1.8718022 0.9555114 1.0296194 1.0986123
z <- data.frame(a1=1:5,b1=LETTERS[1:5],c1=letters[1:5])
foo <- quote(log(a1))
eval(foo,envir=z)