从R函数返回列表VS环境

问题描述 投票:0回答:1

有什么优势/劣势是有使用一个比其他在以下两种情况下?案例我正在恢复它的输出作为环境和情况下-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)
}
r performance comparison r-environment
1个回答
1
投票

虽然同类者,这儿有回报差异列表和环境。从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
© www.soinside.com 2019 - 2024. All rights reserved.