2017-02-26 66 views
0

我正在使用标准data参数在R中写入函数,即参数传递数据帧的名称,如在lm函数中所做的那样。我想有一个可以与被调用的函数:如何处理函数中的“数据”参数?

func(a,data=d) 

,无:

func(d$a) 

data说法。为了简单起见,让函数计算矢量的均值。我该怎么做?

+1

数据本身通常被传递给数据参数 - 不是它的名字。例如'mtcars',而不是''mtcars“'。我想你将不得不展示一些代码来获得答案。 –

+0

我建议看看哈德利关于[非标准评估]的高级R章节(http://adv-r.had.co.nz/Computing-on-the-language.html):它的确很好通过包括这个的几个例子的工作。 – r2evans

+0

“高级R”书非常丰富。谢谢! – Viktor

回答

1

这里有一些可能性。测试全部使用内建数据框BOD

1)S3你可以写一个通用的S3与data.frame和默认方法:

func1 <- function(x, data) UseMethod("func", if (missing(data)) x else data) 
func1.data.frame <- function(x, data) mean(data[[x]]) 
func1.default <- mean 

# test 

func1("Time", BOD) 
## [1] 3.666667 

func1(BOD$Time) 
## [1] 3.666667 

2)如果以上是有点不寻常,你可能更喜欢,如果只是为了使用:

func2 <- function(x, data) if (missing(data)) mean(x) else mean(data[[x]]) 

func2("Time", BOD) 
## [1] 3.666667 

func2(BOD$Time) 
## [1] 3.666667 

3)非标评价你也可以使用非标准的评价,虽然这通常不建议:

func3 <- function(x, data) { 
    if (missing(data)) 
     mean(x) 
    else 
     eval(substitute(mean(x)), data) 
} 

func3(Time, BOD) 
## [1] 3.666667 

func3(BOD$Time) 
## [1] 3.666667 

4)式另一种方式接近它是使用的形式必须是~ X其中Xdata一列,或在式的环境中的对象的一个​​公式。如果省略了data,则默认为调用者的环境。也就是说,它首先在data中查找,如果不是,那么它在公式的环境中查找。

func4 <- function(x, ...) UseMethod("func4") 
func4.formula <- function(x, data = parent.frame()) { 
     p <- parse(text = all.vars(x)) 
     e <- eval(p, data, environment(x)) 
     mean(e) 
} 
func4.default <- mean 

func4(~Time, BOD) 
## [1] 3.666667 

v <- BOD$Time 
func4(~v) 
## [1] 3.666667 

func4(BOD$Time) 
## [1] 3.666667 
+0

谢谢你的回答,但我不喜欢'data'作为第一个参数。实际上,我的函数的第一个参数可能是'glm'类或是一个数值向量。 (所以'UseMethod'将为第一个参数进行切换。) – Viktor

+0

您可以指定要分派给'UseMethod'的对象。见'UseMethod'。我修改了这个例子来使'data'成为第二个参数。然而,建设有点不寻常。 –

+0

请注意'func2'的定义是无效的。试试 'd = data.frame(a = 1:10); func2(a,d)' – Viktor

相关问题