r-环境和懒惰的评估:去掉符号,获得价值

  • 本文关键字:符号 环境 评估 r nse
  • 更新时间 :
  • 英文 :


我正试图解决我遇到的一个问题,我认为这个问题主要围绕着环境、懒惰的评估和与这些事情相关的问题。我有一个主函数(下面的foo1(,在我的实际用例中它是相当广泛的。出于这个原因,我试图提供一些包装函数(foo2foo3(来修改主函数的特定元素。

我的问题是,我最终没有获得实际值,但我获得了符号。有人能为我提供一些指导吗?我需要什么来处理环境,以及什么不需要解决?

这是我的MWE:

foo1 <- function(foo, a, b, c=1, d=1) {
if (!missing(foo)) {
mcall <- as.list(match.call())[-(1:2)]
call_names <- names(mcall)
foo <- foo[-which(names(foo) %in% call_names)]
foo <- c(foo, mcall)
} else {
foo <- list(a=a, b=b, c=c, d=d)
}
return(foo)
}
foo2 <- function(a, b) {
foo1(a=a, b=b)
}
foo3 <- function(foo, c, d) {
foo1(foo, c=c, d=d)
}
f <- foo2(a=1, b=1) 
f <- foo3(f, c=2, d=2)
str(f)
> str(f)
List of 4
$ a: num 1
$ b: num 1
$ c: symbol c
$ d: symbol d

这里我希望cd等于2,但它们是符号。

当您使用match.call时,它可以防止参数的规避。如果你想评估参数,那么你需要明确地这样做

foo1 <- function(foo, a, b, c=1, d=1) {
if (!missing(foo)) {
mcall <- as.list(match.call())[-2]
mcall[[1]] <- quote(list)
mcall <- eval(as.call(mcall))
call_names <- names(mcall)
foo <- foo[-which(names(foo) %in% call_names)]
foo <- c(foo, mcall)
} else {
foo <- list(a=a, b=b, c=c, d=d)
}
return(foo)
}

这将对foo1的调用转换为对list()的调用,并评估结果。另一种选择是将mget()与要捕获的本地环境中的变量一起使用。这将触发规避

foo1 <- function(foo, a, b, c=1, d=1) {
if (!missing(foo)) {
mlist <- mget(intersect(setdiff(ls(), "foo"), names(match.call())))
call_names <- names(mlist)
foo <- foo[-which(names(foo) %in% call_names)]
foo <- c(foo, mlist)
} else {
foo <- list(a=a, b=b, c=c, d=d)
}
return(foo)
}

最新更新