如何处理函数中的“数据”参数?

时间:2017-02-26 01:02:26

标签: r

我在R中使用标准data参数编写函数,即参数传递数据框的名称,就像在lm函数中完成一样。我希望有一个可以调用的函数:

func(a,data=d)

且没有:

func(d$a)

data论点。为简单起见,让函数计算向量的平均值。我该怎么办?

1 个答案:

答案 0 :(得分:4)

以下是一些可能性。测试都使用内置数据框BOD

1)S3 您可以使用data.frame和默认方法编写S3泛型:

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)如果上面有点不寻常,您可能更喜欢使用if:

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