Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何评估data.frame中的调用?_R_Dataframe - Fatal编程技术网

如何评估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)