gpt4 book ai didi

从 R 函数返回列表与环境

转载 作者:行者123 更新时间:2023-12-04 02:52:16 24 4
gpt4 key购买 nike

在以下两种情况下使用一种比另一种有什么优点/缺点? Case-I 将其输出作为环境返回,Case-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)
}

最佳答案

虽然相似,但在返回列表和环境方面存在差异。
来自 Advanced R :

Generally, an environment is similar to a list, with four important exceptions:

  • Every name in an environment is unique.

  • The names in an environment are not ordered (i.e., it doesn’t make sense to ask what the first element of an environment is).

  • An environment has a parent.

  • Environments have reference semantics.

More technically, an environment is made up of two components, the frame, which contains the name-object bindings (and behaves much like a named list), and the parent environment. Unfortunately “frame” is used inconsistently in R. For example, parent.frame() doesn’t give you the parent frame of an environment. Instead, it gives you the calling environment. This is discussed in more detail in calling environments.


从帮助:
help(new.env)

Environments consist of a frame, or collection of named objects, and a pointer to an enclosing environment. The most common example is the frame of variables local to a function call; its enclosure is the environment where the function was defined (unless changed subsequently). The enclosing environment is distinguished from the parent frame: the latter (returned by parent.frame) refers to the environment of the caller of a function. Since confusion is so easy, it is best never to use ‘parent’ in connection with an environment (despite the presence of the function parent.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
并且它们返回具有相同大小的对象:
object.size(res)
#464 bytes

object.size(res2)
#464 bytes
并且您始终可以从环境( list2env )和相反的环境( as.list )生成一个列表:
L <- list(a = 1, b = 2:4, p = pi, ff = gl(3, 4, labels = LETTERS[1:3]))
e <- list2env(L)
e$ff
# [1] A A A A B B B B C C C C
#Levels: A B C

as.list(e)
#$ff
# [1] A A A A B B B B C C C C
#Levels: A B C
#
#$p
#[1] 3.141593
#
#$b
#[1] 2 3 4
#
#$a
#[1] 1

关于从 R 函数返回列表与环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54537065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com