R 'list2env()可能存在错误`

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

在我的R软件包中,我有一个基本上如下所示的函数:

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>