Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:取代基和执行环境_R_Environment - Fatal编程技术网

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)))