Ответ 1
При вызове любой функции R напрямую вы не можете использовать переменные для имен параметров (а по именам параметров я имею в виду те, что слева от символа =
в вызове функции). Имена параметров всегда считаются буквальными. Эти два являются одинаковыми
f(a=3)
f("a"=3)
или посмотрите
deparse(quote(f(a=3)))
# [1] "f(a = 3)"
deparse(quote(f("a"=3)))
# [1] "f(a = 3)"
a <- "b"
deparse(quote(f(a=3)))
# [1] "f(a = 3)"
a
не обязательно должна быть переменной для работы первой, и даже если такая переменная существует, она игнорируется. Кавычки в основном выбрасываются при разборе - это не значение символа, это символ.
Если вам нужно динамически назначать имена переменных, вам нужно создать свои параметры в виде списка и задать имена этого списка.
Если вы собираетесь передать имя своего параметра в качестве символьного значения, вы можете использовать setNames
для установки имен параметров, которые затем можно передать в параметр .dots=
функции mutate_
. Например
update_var_3 <- function(var_name) {
df_foo %>%
mutate_(.dots=
setNames(list(
interp(quote(ifelse(group_var_val == "Yes", var_name_val/10, var_name_val/20)),
group_var_val = as.name("group_var"),
var_name_val = as.name(var_name)
)), var_name))
}
update_var_3("(Weird) Variable name") %>%
head(n = 20)
Это потому, что все они эквивалентны
df <- data_frame(a=1:10)
mutate(df, a=a+5)
mutate(df, "a"=a+5) #identical to first, not really a character variable
mutate_(df, a=quote(a+5))
mutate_(df, .dots=list(a=quote(a+5)))
mutate_(df, .dots=setNames(list(quote(a+5)),"a"))