Вы можете использовать исправить через do.call?

StackOverflow https://stackoverflow.com/questions/3874376

  •  28-09-2019
  •  | 
  •  

Вопрос

У меня есть какой-код, где удобнее звонить 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"))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top