Это в основном та же проблема, что и здесь . Основной причиной является оператор !!
, заставляющий немедленно вычислить свой аргумент, до создается среда анонимной функции. В вашем случае !! quo_name(new_name)
пытается найти определение new_name
относительно выражения в целом (т. Е. Всего выражения mutate(...)
). Поскольку new_name
определено в самом выражении, вы получите циклическую зависимость, которая приведет к ошибке «объект не найден».
У вас есть три варианта:
1) Вытащите лямбду в автономную функцию, чтобы убедиться, что сначала создается ее среда, поэтому все переменные в этой среде должным образом инициализируются до того, как оператор !!
принудительно выполнит их оценку:
f <- function(d) {
new_name = sym("new_value")
d %>% rename(!!new_name := old_name)
}
df %>% mutate(data = map(data, f))
2) Определите new_name
вне выражения, которое пытается форсировать его оценку с помощью !!
new_name = sym("new_value")
df %>%
mutate(data = map(data, function(d) {d %>% rename(!!new_name := old_name)}))
3) Переписать ваше выражение так, чтобы оно не использовало оператор !!
для оценки переменных, которые еще не были инициализированы (new_name
в этом case):
df %>%
mutate(data = map(data, function(d) {
new_name = "new_value"
do.call( partial(rename, d), set_names(syms("old_name"), new_name) )
}))
SIDE ПРИМЕЧАНИЕ: Вы заметите, что я заменил ваши quo()
звонки на sym()
. Функция quo()
захватывает выражение вместе с его окружением. Поскольку строковый литерал "new_value"
всегда будет иметь одно и то же значение, нет необходимости отмечать его окружение. В общем, правильный глагол для ввода имен столбцов в виде символов: sym()
.