我想编写myfunction(y,data)
类型的函数,y
是data
的列名。您是否知道如何对其进行编码以便在调用时能够使用公式myfunction(y~,data=mydata)
?
另外,如何在函数中使用data$y
形式的东西?
答案 0 :(得分:2)
也许你应该看看model.frame
:
model.frame(formula= z~y,data=data.frame(y=1:3,x=1:3,z=1:3))
z y
1 1 1
2 2 2
3 3 3
结果是包含公式中使用的变量的data.frame。
答案 1 :(得分:1)
您可以使用以下公式:
my_function(~y, dat)
并使用函数内的as.character
检索它。然后只需使用as.character
结果中的第二个元素来索引向量:
dat[[as.character(formula)[2]]]
或者只是完全跳过公式并直接传递字符串:
dat[[string]]
答案 2 :(得分:0)
如果您只需要将单个列名称作为不带引号的字符串传递,那么请使用:
myfunction <- function(y, data)
{
colname <- as.character(substitute(y))
data[, colname]
}
示例:
myfunction(mpg, mtcars)
请注意,选择列是使用方括号,而不是使用美元符号。这是因为$
没有评估参数,并且会查找名为"colname"
的列。
答案 3 :(得分:0)
请注意y~
无效的公式语法,但y~.
没问题。使用它:
1)试试这个:
myfunction <- function(y, data) {
if (inherits(y, "formula")) y <- all.vars(y)[1]
data[[y]]
}
2)或使用S3 dispatch的这个更具可扩展性的版本:
# generic
myfunction <- function(y, data) UseMethod("myfunction")
# formula method
myfunction.formula <- function(y, data) {
y <- all.vars(y)[1]
NextMethod()
}
# default method
myfunction.default <- function(y, data) data[[y]]
测试它(任何一个解决方案应该给出相同的结果):
> myfunction(demand ~ ., BOD)
[1] 8.3 10.3 19.0 16.0 15.6 19.8
> myfunction("demand", BOD)
[1] 8.3 10.3 19.0 16.0 15.6 19.8
这也有效:
> myfunction(~ demand, BOD)
[1] 8.3 10.3 19.0 16.0 15.6 19.8