在R函数中使用公式中的变量

在R函数中使用公式中的变量,r,function,formula,R,Function,Formula,我想写一个myfunction(y,data)类型的函数,y是data的列名。您是否知道如何对其进行编码,以便在调用时能够使用公式myfunction(y~,data=mydata) 另外,如何在函数中使用data$y形式的某些东西?您可以使用以下形式的公式: my_function(~y, dat) 并在函数中使用as.character检索它。然后只需使用as.character结果中的第二个元素对向量进行索引: dat[[as.character(formula)[2]]] 或者干脆跳

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


另外,如何在函数中使用
data$y
形式的某些东西?

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

my_function(~y, dat)
并在函数中使用
as.character
检索它。然后只需使用
as.character
结果中的第二个元素对向量进行索引:

dat[[as.character(formula)[2]]]
或者干脆跳过公式,直接传递字符串:

dat[[string]]

也许你应该看看
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,其中包含公式中使用的变量。

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

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

    data[, colname]
}

请注意,选择列时使用方括号,而不是美元符号。这是因为
$
不计算参数,而是查找名为
“colname”

的列。请注意,
y~
不是有效的公式语法,但
y~。
是可以的。利用这一点:

1) 试试这个:

myfunction <- function(y, data) {
   if (inherits(y, "formula")) y <- all.vars(y)[1]
   data[[y]]
}
这也适用于:

> myfunction(~ demand, BOD)
[1]  8.3 10.3 19.0 16.0 15.6 19.8

为什么特别需要这个公式?没有特别的需要,我只想把一个colname传递给一个函数,然后我只需要传递一个字符串,然后像这样使用它:
data[[string]]
。当使用as.character时,它会给出以下结果:
[1]“~”“Species”
Species是y的colname…你知道如何在函数中使用像data$y这样的东西吗?@WAF你不知道。
$
功能主要用于交互式使用。您正在查找
[[
。如
数据[[mycl]]
。或者可能是
数据[,mycl]
# 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