dar*_*zig 5 r function wrapper
我想写周围的自定义功能的包装,需要一些矢量作为输入(如:mtcars$hp,mtcars$am等),以获得输入作为数据帧的名称(如data参数,如:mtcars)和变量名(如:hp和am),和往常一样在大多数标准功能.
但我有一些问题,我建议的'演示'功能(包装mean不起作用.
码:
f <- function(x, data=NULL) {
if (!missing(data)) {
with(data, mean(x))
} else {
mean(x)
}
}
Run Code Online (Sandbox Code Playgroud)
对矢量运行当然是有效的:
> f(mtcars$hp)
[1] 146.69
Run Code Online (Sandbox Code Playgroud)
但with不幸的是失败了:
> f(hp, mtcars)
Error in with(d, mean(x)) : object 'hp' not found
Run Code Online (Sandbox Code Playgroud)
在全球环境中/没有我的自定义功能正常工作:
> with(mtcars, mean(hp))
[1] 146.69
Run Code Online (Sandbox Code Playgroud)
我试图做一些实验substitute,deparse和其他人,但没有成功.任何提示都会受到欢迎!
Ari*_*man 10
这是拼图的关键部分:
f <- function(x,data=NULL) {
eval(match.call()$x,data) # this is mtcars$hp, so just take the mean of it or whatever
}
> f(hp,mtcars)
[1] 110 110 93 110 175 105 245 62 95 123 123 180 180 180 205 215 230 66 52 65 97 150 150 245 175 66
[27] 91 113 264 175 335 109
# it even works without a data.frame specified:
> f(seq(10))
[1] 1 2 3 4 5 6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)
请参阅@Andrie与@Hadley文档的链接,了解其工作原理.请参阅@ Hadley的注释,了解一个关键的警告:f()不能从另一个函数内部运行.
基本上R使用惰性评估(例如,在实际使用之前它不会对事物进行评估).所以你可以通过传递它,hp因为它仍然是一个未经评估的符号,直到它出现在某个地方.既然match.call把它作为一种象征并等待评估它,一切都很好.
然后eval在指定的环境中对其进行评估.根据?eval,第二个论点代表:
要评估expr的环境.也可以是NULL,列表,数据框,pairlist或sys.call指定的整数.
因此,您可以使用NULL(如果未传递data.frame)或data.frame.
延迟评估的证明是这不会返回错误(因为x从未在函数中使用):
> g <- function(x) {
+ 0
+ }
> g(hp)
[1] 0
Run Code Online (Sandbox Code Playgroud)