Использование get in 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,2 а такжеenvir=NULL как варианты).

Если кому-то случится узнать немного больше, чем я, об окружающей среде, особенно в таких «странных» случаях, я хотел бы знать, как решить эту проблему.

Спасибо за ваше время,

Juan

Ответы на вопрос(1)

Ваш ответ на вопрос