Utilizando entrar dentro de lapply, dentro de una función

Esta puede parecer una pregunta demasiado complicada, pero me tiene volviéndome un poco loco por algún tiempo. También es por curiosidad, porque ya tengo una forma de hacer lo que necesito, así que no es tan importante.

En R, necesito una función para devolver un objeto de lista con todos los argumentos y los valores ingresados por el usuario. Para esto he hecho este código (ejemplo de juguete):

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

Así que cuando se le pregunta esto:

> foo(b=0)

$a
[1] 1

$b
[1] 0

$h
[1] "coconut"

Este resultado es perfecto. La cosa es que cuando trato de usarlapply con el mismo objetivo, para ser un poco más eficiente (y elegante), no funciona como yo quiero:

foo <- function(a=1, b=5, h='coconut') {
    frm <- formals(foo)
    parms <- lapply(names(frm), get)
    names(parms) <- names(frm)
    return(parms)
}

l problema claramente es con el entorno en el queget evalúa su primer argumento (una cadena de caracteres, el nombre de la variable). Esto lo sé en parte por el mensaje de error:

> foo(b=0)
Error in FUN(c("a", "b", "h")[[1L]], ...) : object 'a' not found

y también, porque cuando en el.GlobalEnv entorno hay objetos con los nombres correctos, foo devuelve sus valores en su lugar:

> a <- 100
> b <- -1
> h <- 'wallnut'
> foo(b=0)
$a
[1] 100

$b
[1] -1

$h
[1] "wallnut"

Obviamente, comoget por defecto evalúa en elparent.frame(), busca los objetos en la.GlobalEnv entorno, en lugar del de la función actual. Esto es extraño, ya que esto no sucede con la primera versión de la función.

He intentado muchas opciones para hacer que la funciónget para evaluar en el entorno adecuado, pero no pude hacerlo correctamente (he intentadopos=-2,0,1,2 yenvir=NULL como opciones).

Si alguien sabe un poco más que yo sobre entornos, especialmente en estos casos "extraños", me encantaría saber cómo resolver esto.

Gracias por tu tiempo

Juan

Respuestas a la pregunta(3)

Su respuesta a la pregunta