r - 在函数内部使用 get inside lapply

标签 r lapply

这似乎是一个过于复杂的问题,但它让我有些发疯了一段时间。也是出于好奇,因为我已经有了做我需要的方法,所以没那么重要。

在 R 中,我需要一个函数来返回一个包含所有参数和用户输入的值的命名列表对象。为此,我制作了以下代码(玩具示例):

foo <- function(a=1, b=5, h='coconut') {
    frm <- formals(foo)
    parms <- frm
    for (i in 1:length(frm))
        parms[[i]] <- get(names(frm)[i])
    return(parms)
}

所以当被问到时:
> foo(b=0)

$a
[1] 1

$b
[1] 0

$h
[1] "coconut"

这个结果是完美的。问题是,当我尝试使用 lapply为了相同的目标,为了更高效(和优雅),它不像我想要的那样工作:
foo <- function(a=1, b=5, h='coconut') {
    frm <- formals(foo)
    parms <- lapply(names(frm), get)
    names(parms) <- names(frm)
    return(parms)
}

问题显然在于 get 所在的环境。评估它的第一个参数(字符串,变量的名称)。我部分地从错误消息中知道这一点:
> foo(b=0)
Error in FUN(c("a", "b", "h")[[1L]], ...) : object 'a' not found

而且,因为当在 .GlobalEnv环境中存在具有正确名称的对象, foo 改为返回它们的值:
> a <- 100
> b <- -1
> h <- 'wallnut'
> foo(b=0)
$a
[1] 100

$b
[1] -1

$h
[1] "wallnut"

显然,如 get默认情况下计算 parent.frame() ,它在 .GlobalEnv 中搜索对象环境,而不是当前函数的环境。这很奇怪,因为该函数的第一个版本不会发生这种情况。

我尝试了许多选项来制作函数 get在正确的环境中进行评估,但无法正确进行(我尝试过 pos=-2,0,1,2envir=NULL 作为选项)。

如果有人碰巧比我更了解环境,特别是在这种“奇怪”的情况下,我很想知道如何解决这个问题。

谢谢你的时间,

胡安

最佳答案

只需将当前环境转换为列表:

foo <- function(a=1, b=5, h='coconut') {
  as.list(environment())
}
foo(a = 0, h = 'mango')

关于r - 在函数内部使用 get inside lapply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8016636/

相关文章:

r - 使用lapply将功能应用于数据帧列表,并将输出保存到名称不同的文件中

r - 如何将特定(动态)列的日期增加一年?

r - 如何生成L长度的二进制码置换矩阵

r - 使用 Tidyverse 和基本 R 函数“Which”

r - 如何在函数中结合 lapply 和 dplyr

r - 来自 mgcv 的 plot.gam with all.terms = TRUE 在一个函数中

r - 将变量中的第一个值作为 R 中的变量名

R 使用 apply() 或 lapply() 等加速 for 循环

r - 从满足给定条件的变量名称创建变量

R:向 data.frame 添加列以分为低、中、高范围