我正在使用标准data
参数在R中写入函数,即参数传递数据帧的名称,如在lm
函数中所做的那样。我想有一个可以与被调用的函数:如何处理函数中的“数据”参数?
func(a,data=d)
,无:
func(d$a)
data
说法。为了简单起见,让函数计算矢量的均值。我该怎么做?
我正在使用标准data
参数在R中写入函数,即参数传递数据帧的名称,如在lm
函数中所做的那样。我想有一个可以与被调用的函数:如何处理函数中的“数据”参数?
func(a,data=d)
,无:
func(d$a)
data
说法。为了简单起见,让函数计算矢量的均值。我该怎么做?
这里有一些可能性。测试全部使用内建数据框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
其中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
数据本身通常被传递给数据参数 - 不是它的名字。例如'mtcars',而不是''mtcars“'。我想你将不得不展示一些代码来获得答案。 –
我建议看看哈德利关于[非标准评估]的高级R章节(http://adv-r.had.co.nz/Computing-on-the-language.html):它的确很好通过包括这个的几个例子的工作。 – r2evans
“高级R”书非常丰富。谢谢! – Viktor