私は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
関数を定義します。 assign_general(a[[1]], 5)
はa[[1]] <- 5
に相当します。しかし、私の実装はちょっとハッキリしているようですが、私は見逃しているかもしれないコーナーケースを知りませんし、もっと直接的な方法があればまだ分かりません。よりよい解決策です。
'assign'だけ使用できますか? – Dason
'assign'は任意の左辺では動作しません。 'lhs < - quo(a [[1]])'ならば? –
rlangを使用している理由を尋ねることはできますか? – Dason