6

给定一个环境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 方法的不一致[<-[[<-以及如何正确实现环境的子集分配吗?

4

1 回答 1

1

这是一个开始,修改自?list2env

L <- list(a = 1, b = 2:4, p = pi, ff = gl(3, 4, labels = LETTERS[1:3]))
e <- list2env(L)
addToEnv <- function(e, names, values) {
    l1 <- sapply(values, list)
    names(l1) <- names
    el1 <- mget(ls(e), envir=e)
    al1 <- as.list(c(el1, l1))
    return(list2env(al1))
    }
e2 <- addToEnv(e, names=letters[7:8], values=letters[9:10])
mget(ls(e2), envir=e2)

给予:

$a
[1] 1

$b
[1] 2 3 4

$ff
 [1] A A A A B B B B C C C C
Levels: A B C

$g
[1] "i"

$h
[1] "j"

$p
[1] 3.141593

我承认这不是有效的,但应该适用于小型环境。

于 2014-05-14T04:31:54.383 回答