我在R中使用标准data
参数编写函数,即参数传递数据框的名称,就像在lm
函数中完成一样。我希望有一个可以调用的函数:
func(a,data=d)
且没有:
func(d$a)
data
论点。为简单起见,让函数计算向量的平均值。我该怎么办?
答案 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
,其中X
是data
中的一列或公式环境中的一个对象。如果省略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