我試圖使用rlang包構造一個表達式,該表達式賦予一個右側表達式(要賦值的值)和一個左側表達式(指定給它的位置)的賦值。例如,假設我要構建和評價表達a <- 5
:是否可以使用rlang構造賦值表達式?
> 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:我寫了一個proof of concept演示了什麼,我試圖完成。它定義了允許任意左手側的功能,例如, assign_general(a[[1]], 5)
相當於a[[1]] <- 5
。然而,我的執行看起來有些ha,,我不知道我可能錯過了哪些角落案例,而且我仍然不確定是否有更直接的方式來執行此操作,所以我仍然有興趣查看是否有人有更好的解決方案。
可你只需要使用'assign'? – Dason
'assign'在任意左側不起作用。如果'lhs < - quo(a [[1]])'怎麼辦? –
我可以問爲什麼你要使用rlang嗎? – Dason