我当前正在编写一个将方程式作为参数的函数。该函数将期望变量与数据的列名分开。
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))
我知道您可能在想什么,这是一个很好的解决方法
mydata$x+(mydata$y^2)
问题
问题是我想将equ的输入传递给新函数。
new_function <- function(new.equ) {
string <- deparse(substitute(new.equ))
#does some stuff....
return(output) }
但是,当从my_function的执行环境更改为new_function时,调用deparse(substitute(equ))
返回"equ"
而不是"x+(y^2)"
我知道函数替代返回明确分配给变量的内容。 (equ),但我想知道new_function()是否可以查看my_function()的执行环境,以便获得所需的"x+(y^2)"
更新
考虑之后,我可以将传递给new.equ的内容更改为equal的原始版本,如下所示...
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) }
但是我最初的问题仍然存在,因为我还是R环境的新手。是否有更优雅的方式来执行环境?
答案 0 :(得分:0)
像这样使用非标准评估可能会很麻烦。与其尝试从传递给函数的Promise中捕获表达式,不如只是传递一个公式,这要安全得多。例如
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))
或者给您的函数一个额外的参数,您可以在其中传递一个表达式,这样您就不必依赖promise。这使得编写可以调用您的函数的其他函数更加容易。
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)))