给定一个环境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>
除了原始的赋值运算符之外,[[<-
对于 class没有 S3 方法environment
:
> methods(class = environment)
[1] as.list.environment
[[<-
因此,如果原始函数存在这样的默认值,则必须使用默认值进行原始赋值。尽管如此,我还是为[<-.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 方法的不一致[<-
,[[<-
以及如何正确实现环境的子集分配吗?