R 'list2env()可能存在错误`
在我的R软件包中,我有一个基本上如下所示的函数:R 'list2env()可能存在错误`,r,environment,evaluation,R,Environment,Evaluation,在我的R软件包中,我有一个基本上如下所示的函数: li <- list(foo = "bar", bar = "foo") f1 <- function(list) { list2env(li, parent = parent.frame()) } f1(li) 当它作为函数参数显式传递时,parent.frame()。这对我来说似乎是一个错误。另外,默认参数行为对我来说似乎更正确,因为它提供了最通用的语义:如果您想要调用list2en
li <- list(foo = "bar", bar = "foo")
f1 <- function(list) {
list2env(li, parent = parent.frame())
}
f1(li)
当它作为函数参数显式传递时,parent.frame()。这对我来说似乎是一个错误。另外,默认参数行为对我来说似乎更正确,因为它提供了最通用的语义:如果您想要调用list2env()
的环境,请使用parent.frame(n=1)
,然后增加n
以向上移动搜索路径。否则,很难访问调用环境(除非将参数留空)
假设这是R想要的行为,这是一个简单的解决方案:
list2env_fixed <- function (x, envir = NULL, parent = parent.frame(),
hash = (length(x) > 100), size = max(29L, length(x))) {
if (is.null(envir))
envir <- new.env(hash = hash, parent = eval(substitute(parent)), size = size)
.Internal(list2env(x, envir))
}
f2_fixed <- function(list) {
env2 <- list2env_fixed(li, parent = parent.frame())
rlang::env_parents(env2, last = emptyenv())
}
f2_fixed(li)
#[[1]] <env: 0x5afd59d8d730>
#[[2]] $ <env: global>
#[[3]] $ <env: tools:rstudio>
#[[4]] $ <env: package:stats>
#[[5]] $ <env: package:graphics>
#[[6]] $ <env: package:grDevices>
#[[7]] $ <env: package:utils>
#[[8]] $ <env: package:datasets>
#[[9]] $ <env: package:methods>
#[[10]] $ <env: Autoloads>
#[[11]] $ <env: package:base>
#[[12]] $ <env: empty>
list2env_fixed 100),size=max(29L,长度(x))){
if(is.null(envir))
envir这两种情况不一样
parent.frame()
出现在函数中——默认参数是函数定义的一部分——而在另一种情况下,它被传递到函数并出现在调用方中。因此,在第一种情况下,它指的是函数的父帧,即调用方,在第二种情况下,它指的是调用方的调用方。我想这会导致ense——似乎应该有一种方法可以使用显式参数引用当前环境。是否有理由不延迟评估以提供该参数?environment()
返回当前环境。
li <- list(foo = "bar", bar = "foo")
f1 <- function(list) {
env <- list2env(li)
rlang::env_parents(env, last = emptyenv())
}
f2 <- function(list) {
env2 <- list2env(li, parent = parent.frame())
rlang::env_parents(env2, last = emptyenv())
}
f1(li)
#[[1]] <env: 0x5afd59d8d730>
#[[2]] $ <env: global>
#[[3]] $ <env: tools:rstudio>
#[[4]] $ <env: package:stats>
#[[5]] $ <env: package:graphics>
#[[6]] $ <env: package:grDevices>
#[[7]] $ <env: package:utils>
#[[8]] $ <env: package:datasets>
#[[9]] $ <env: package:methods>
#[[10]] $ <env: Autoloads>
#[[11]] $ <env: package:base>
#[[12]] $ <env: empty>
f2(li)
#[[1]] <env: global>
#[[2]] $ <env: tools:rstudio>
#[[3]] $ <env: package:stats>
#[[4]] $ <env: package:graphics>
#[[5]] $ <env: package:grDevices>
#[[6]] $ <env: package:utils>
#[[7]] $ <env: package:datasets>
#[[8]] $ <env: package:methods>
#[[9]] $ <env: Autoloads>
#[[10]] $ <env: package:base>
#[[11]] $ <env: empty>
list2env_fixed <- function (x, envir = NULL, parent = parent.frame(),
hash = (length(x) > 100), size = max(29L, length(x))) {
if (is.null(envir))
envir <- new.env(hash = hash, parent = eval(substitute(parent)), size = size)
.Internal(list2env(x, envir))
}
f2_fixed <- function(list) {
env2 <- list2env_fixed(li, parent = parent.frame())
rlang::env_parents(env2, last = emptyenv())
}
f2_fixed(li)
#[[1]] <env: 0x5afd59d8d730>
#[[2]] $ <env: global>
#[[3]] $ <env: tools:rstudio>
#[[4]] $ <env: package:stats>
#[[5]] $ <env: package:graphics>
#[[6]] $ <env: package:grDevices>
#[[7]] $ <env: package:utils>
#[[8]] $ <env: package:datasets>
#[[9]] $ <env: package:methods>
#[[10]] $ <env: Autoloads>
#[[11]] $ <env: package:base>
#[[12]] $ <env: empty>