1

我想写一个类型的函数myfunction(y,data)y作为 的列名data。您是否知道如何对其进行编码以便在调用时能够使用该公式myfunction(y~,data=mydata)

另外,我怎样才能data$y在函数中使用某种形式的东西?

4

4 回答 4

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

结果是一个包含公式中使用的变量的数据框。

于 2013-05-19T12:52:19.030 回答
1

您可以使用以下形式的公式:

my_function(~y, dat)

as.character并在函数内部使用检索它。然后简单地使用结果中的第二个元素as.character来索引向量:

dat[[as.character(formula)[2]]]

或者完全跳过公式并直接传递字符串:

dat[[string]]
于 2013-05-19T11:56:06.167 回答
0

如果您只需要将单个列名作为不带引号的字符串传递,请使用以下命令:

myfunction <- function(y, data)
{
    colname <- as.character(substitute(y))

    data[, colname]
}

例子:

myfunction(mpg, mtcars)

请注意,选择列是使用方括号完成的,而不是使用美元符号。那是因为$不评估参数,并且会查找名为 的列"colname"

于 2013-05-19T17:53:50.177 回答
0

请注意,这y~不是有效的公式语法,但y~.可以。使用它:

1)试试这个:

myfunction <- function(y, data) {
   if (inherits(y, "formula")) y <- all.vars(y)[1]
   data[[y]]
}

2) 或者这个使用 S3 调度的更可扩展的版本:

# 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
于 2013-05-19T18:04:13.863 回答