有什么优势/劣势是有使用一个比其他在以下两种情况下?案例我正在恢复它的输出作为环境和情况下-II正在恢复它的输出为列表。
案例一:
function(x) {
ret <- new.env()
ret$x <- x
ret$y <- x^2
return(ret)
}
案例二:
function(x) {
ret <- list()
ret$x <- x
ret$y <- x^2
return(ret)
}
虽然同类者,这儿有回报差异列表和环境。从qazxsw POI:
一般来说,环境类似于一个列表,有四个重要的例外:
- 在环境中的每个名称是唯一的。
- 环境中的名称不排序(即,它是没有意义的问环境的第一要素是什么)。
- 一个环境都有一个父。
- 环境有引用语义。
更技术性的,环境是由两个部分组成,框架,其中包含的名字对象的绑定(和行为很像命名列表),以及母公司的环境了。不幸的是“帧”是使用不一致的R.例如,parent.frame()不给你的环境的父框架。取而代之的是,它可以让你的通话环境。这是更详细的呼叫环境中讨论。
从帮助:
Advanced R
环境包括一个框架,或命名对象的集合,和指向一个封闭的环境。最常见的例子是本地的一个函数调用的变量的框架;其外壳是其中函数被定义(除非随后改变)的环境。封闭环境是从父帧分辨:后者(通过parent.frame返回)是指一种功能的调用者的环境。由于混乱是很容易的,最好永远不要在一个环境中(尽管功能parent.env的存在)连接使用“父”。
从功能的文档:
help(new.env)
然而e1 <- new.env(parent = baseenv()) # this one has enclosure package:base.
e2 <- new.env(parent = e1)
assign("a", 3, envir = e1)
ls(e1)
#[1] "a"
意志给环境创建:
ls
您可以访问您的环境中的对象,就像一个列表:
ls()
#[1] "e1" "e2"
与功能播放:
e1$a
#[1] 3
他们的表现也相当类似,根据f1 <- function(x) {
ret <- new.env()
ret$x <- x
ret$y <- x^2
return(ret)
}
res <- f1(2)
res
#<environment: 0x0000021d55a8a3e8>
res$y
#[1] 4
f2 <- function(x) {
ret <- list()
ret$x <- x
ret$y <- x^2
return(ret)
res2 <- f(2)
res2
#$x
#[1] 2
#$y
#[1] 4
res2$y
#[1] 4
:
microbenchmarking
他们返回与相同尺寸的对象:
microbenchmark::microbenchmark(
function(x) {
ret <- new.env()
ret$x <- x
ret$y <- x^2
return(ret)
},
function(x) {
ret <- list()
ret$x <- x
ret$y <- x^2
return(ret)
},
times = 500L
)
#Unit: nanoseconds
# #expr
# function(x) { ret <- new.env() ret$x <- x ret$y <- x^2 #return(ret) }
# function(x) { ret <- list() ret$x <- x ret$y <- x^2 #return(ret) }
# min lq mean median uq max neval
# 0 1 31.802 1 100 801 500
# 0 1 37.802 1 100 2902 500
你可以随时生成的环境(qazxsw POI)的列表和逆太(qazxsw POI):
object.size(res)
#464 bytes
object.size(res2)
#464 bytes