R:取代基和执行环境
我目前正在写一个函数,它将一个方程作为参数。函数期望变量是数据列名的一部分R:取代基和执行环境,r,environment,R,Environment,我目前正在写一个函数,它将一个方程作为参数。函数期望变量是数据列名的一部分 mydata <- data.frame(x=c(1,2,3,4),y=c(5,6,7,8), z=c(9,10,11,12)) my_function <- function(data, equ) { EQU.sub <- deparse(substitute(equ)) #Check if colnames are used for(i in 1:length(colnames(data))
mydata <- data.frame(x=c(1,2,3,4),y=c(5,6,7,8), z=c(9,10,11,12))
my_function <- function(data, equ) {
EQU.sub <- deparse(substitute(equ))
#Check if colnames are used
for(i in 1:length(colnames(data)) {
if(str_detect(string = EQU.sub, pattern = colnames(data)[i])) {
#if used, create variable with its name.
assign(x = colnames(data)[i],
value = eval(parse(text = paste("data$",
colnames(data),
sep = ""))))
} else {
warning(paste(colnames[i], "was not used in EQU"))
}
}
df$new.value <- eval(equ)
output <- function(new.equ = equ)
return(df)
}
my_function(data = mydata, equ = x+(y^2))
但是,当从my_函数的执行环境更改为新的_函数时,调用deparse(substitute(eq))
返回“eq”
,而不是“x+(y^2)”
我知道函数替换返回显式分配给变量的内容。(eq)但是我想知道是否有一种方法可以让新函数()能够看到我的函数()的执行环境,这样我就可以得到所需的“x+(y^2)”
更新
经过思考,我可以将传递给new.eq的内容更改为eq的deparsed版本,如下所示
output <- function(new.equ = EQU.sub)
new_function <- function(new.equ) {
#given that these variables are available
value <- parse(text = new.equ)
#does some stuff....
return(output) }
输出使用像这样的非标准评估可能会非常混乱。与其试图从传递给函数的承诺中捕获表达式,只传递公式要安全得多。比如说
mydata <- data.frame(x=c(1,2,3,4),y=c(5,6,7,8), z=c(9,10,11,12))
my_function <- function(data, equ) {
stopifnot(inherits(equ, "formula"))
eval(equ[[2]], data)
}
new_function <- function(newequ) {
my_function(mydata, newequ)
}
my_function(mydata, ~x+(y^2))
new_function(~x+(y^2))
mydata在本例中,您缺少了一个)
和其他内容,因此它还不能直接复制。在我添加)
之后,它抛出“object'eq.var.levels'not found”@Hack-R eq.var.levels现在应该消失了我的函数可以这样写了<代码>我的_函数
mydata <- data.frame(x=c(1,2,3,4),y=c(5,6,7,8), z=c(9,10,11,12))
my_function <- function(data, equ) {
stopifnot(inherits(equ, "formula"))
eval(equ[[2]], data)
}
new_function <- function(newequ) {
my_function(mydata, newequ)
}
my_function(mydata, ~x+(y^2))
new_function(~x+(y^2))
my_function <- function(data, equ, .equ=substitute(equ)) {
eval(.equ, data)
}
new_function <- function(newequ) {
equ <- substitute(newequ)
my_function(mydata, .equ=equ)
}
my_function(mydata, x+(y^2))
new_function(x+(y^2))
my_function(mydata, .equ=quote(x+(y^2)))