環境が与えられた場合x
、 の便利な略記assign(x, value, envir = e)
は と書くことe[[x]] <- value
です。現在、複数のオブジェクトを一度に割り当てるためのサブセット演算子に相当するものはありません。
> e = new.env(parent = emptyenv())
> e[["a"]] <- 1
> ls(e)
[1] "a"
> e[c("b", "c")] <- c(1,2)
Error in e[c("b", "c")] <- c(1, 2) :
object of type 'environment' is not subsettable
の組み込みの S3 機能を使用して作成することを望んでいました[<-
。私が最初に気付いた奇妙な点は、 S3 関数を模倣しているにもかかわらず、[[<-
と[<-
が原始関数であるということです。
> methods("[<-")
[1] [<-.data.frame [<-.Date [<-.environment [<-.factor [<-.POSIXct [<-.POSIXlt [<-.raster* [<-.ts*
通常、S3 関数は、本体が単なる呼び出しである形式になっていますUseMethod
。例えば:
> summary
function (object, ...)
UseMethod("summary")
<bytecode: 0x1a7c3a8>
<environment: namespace:base>
代入演算子がプリミティブであることに加えて、[[<-
for classの S3 メソッドはありませんenvironment
。
> methods(class = environment)
[1] as.list.environment
[[<-
したがって、プリミティブ関数にそのようなデフォルトがある場合、使用する元の割り当てはデフォルトを使用して行う必要があります。それにもかかわらず、私は S3 関数を実装しました[<-.environment
:
> `[<-.environment` = function(x, names, values) {
mapply(function(name, value) { x[[name]] <- value }, names, values) }
これは、以下に対して正しく実装されているかのように動作するように見えます。
> methods(class = environment)
[1] [<-.environment as.list.environment
> methods(`[<-`)
[1] [<-.data.frame [<-.Date [<-.environment [<-.factor [<-.POSIXct [<-.POSIXlt [<-.raster* [<-.ts*
ただし、同じエラーが発生します。
> e = new.env(parent = emptyenv())
> e[c("b", "c")] <- c(1,2)
Error in e[c("b", "c")] <- c(1, 2) :
object of type 'environment' is not subsettable
[<-
と の S3 メソッドとの不一致と、[[<-
環境のサブセット割り当てを正しく実装する方法の両方を誰かが説明できますか?