Я пытаюсь использовать пакет rlang для создания выражения, выполняющего присваивание, учитывая правостороннее выражение (присваиваемое значение) и левостороннее выражение (место для его присвоения). Например, предположим, что я хочу построить и оценить выражение a <- 5
:
> library(rlang)
> a <- "Not 5"
> lhs <- quo(a)
> rhs <- quo(5)
> eval_tidy(quo( (!!lhs) <- (!!rhs)) ) # Error
Error in (~a) <- (~5) : could not find function "(<-"
> eval_tidy(quo(`<-`(!!lhs, !!rhs))) # Error
Error in ~a <- ~5 : could not find function "~<-"
> eval_tidy(quo(`<-`(!!f_rhs(lhs), !!rhs))) # No error, but no effect
[1] 5
> stopifnot(a == 5)
Error: a == 5 is not TRUE
> print(a)
[1] "Not 5"
Как видите, ни один из вышеперечисленных способов построения и оценки этого задания не дает желаемого эффекта. Есть ли способ сделать это правильно?
Изменить: использование assign
вместо <-
не является хорошим решением, поскольку оно работает только для переменных, а не для элементов объектов. Например, это не сработает для:
> a <- list(ShouldBeFive="Not 5")
> lhs <- quo(a$ShouldBeFive)
Изменить 2: я написал доказательство концепции, которое демонстрирует, что Я пытаюсь выполнить. Он определяет функцию assign_general
, которая допускает произвольные левые части, например. assign_general(a[[1]], 5)
эквивалентно a[[1]] <- 5
. Однако моя реализация кажется какой-то хакерской, я не знаю, какие краеугольные случаи я мог пропустить, и я до сих пор не уверен, есть ли более прямой способ сделать это, поэтому мне все еще интересно узнать, есть ли у кого-нибудь лучшее решение.
assign
? - person Dason   schedule 13.07.2017assign
не будет работать с произвольными левыми сторонами. Что, еслиlhs <- quo(a[[1]])
? - person Ryan C. Thompson   schedule 13.07.2017