Вы можете использовать исправить через do.call?
Вопрос
У меня есть какой-код, где удобнее звонить fix
через do.call
, а не напрямую. Любой старый кадр данных будет работать на этот пример:
dfr <- data.frame(x = 1:5, y = letters[1:5])
Очевидная первая попытка
do.call("fix", list(dfr))
К сожалению, это терпит неудачу с
Error in fix(list(x = 1:5, y = 1:5)) : 'fix' requires a name
Итак, мы даем ему имя:
do.call("fix", list(dfr = dfr))
На этот раз это терпит неудачу с
Error in is.name(subx) : 'subx' is missing
Для записи, edit
тоже не работает.
dfr <- do.call("edit", list(dfr = dfr))
Может кто-нибудь думать о разумном обходном пути, пожалуйста?
Редактировать: При отражении, я забыл, что fix
Всегда сбрасывает свой ответ в глобальную среду, которая в порядке для тестовых примеров, но не так хорошо для использования с функциями. Отличный обходной путь Джошуа не распространяется на использование с edit
.
Для бонусных баллов, как вы звоните edit
через do.call
?
Решение
Вы можете использовать substitute
, который также полезен, когда вы хотите использовать имена переменных в качестве меток.
do.call("fix",list(substitute(dfr)))
Редактировать для ясности
Легче увидеть, как это работает, используя call
команда:
> call("fix",dfr)
fix(list(x = c(1, 2, 3, 4, 5), y = 1:5))
> call("fix",substitute(dfr))
fix(dfr)
Таким образом, когда вы используете substitute
Команда, которая создана, использует имя символа, а не оценочный символ. Если вы обертываете eval
Вокруг этих выражений вы видите, что первый пример дает ту же ошибку, которую вы столкнулись, и второй пример работает как ожидается.
После прочтения ссылки Хэдли становится понятнее, что оценивается:
> as.name("dfr")==substitute(dfr)
[1] TRUE
Другие советы
Первая ошибка дает вам подсказку. Это работает:
do.call(fix,list("dfr"))
Вы все равно получите ту же ошибку на вашей второй попытке, даже если вы использовали dfr="dfr"
Потому что названный список нуждается в именах аргументов what
(функция). Так что ваша вторая попытка должна быть:
do.call(fix,list(x="dfr"))