【发布时间】:2015-04-23 17:04:16
【问题描述】:
在 Hadley 的 Advanced R 书中,有一节关于将环境用作“大型物体的容器”(见下文)。我正在寻找一些示例来说明这种方法的最佳实践。我查看了here,但没有找到任何明确解决此问题的内容。
如果相关,我的应用程序是一个闪亮的应用程序,其中应用程序环境中的数据与导出的函数(在 R/ 中)共享。另请参阅question。
用于管理数据流的函数是here。 r_env 是闪亮的环境。如果在应用程序外部调用分析函数,则该函数会在用户退出应用程序或在全局环境中查找转储到 R(studio) 的数据。
http://adv-r.had.co.nz/Environments.html#explicit-envs
"避免复制 由于环境具有引用语义,因此您永远不会意外创建副本。这使它成为大型物体的有用容器。对于经常需要管理大型基因组对象的生物导体封装来说,这是一种常用技术。 "
编辑
我预计数据传递给函数的方式会有所不同。使用几种不同的方法,差异似乎很小。 Hadley 所指的(未命名的)生物导体包中使用的方法有什么不同?
library(ggplot2)
library(microbenchmark)
dat <- diamonds
dataset <- "dat"
r_env <- new.env()
r_env$dat <- diamonds
reg1 <- function(dataset)
lm(price ~ carat + color, data = get(dataset))
reg2 <- function(dataset)
lm(price ~ carat + color, data = r_env[[dataset]])
reg3 <- function(dat)
lm(price ~ carat + color, data = dat)
microbenchmark(times = 100,
reg1(dataset),
reg2(dataset),
reg3(dat)
)
Unit: milliseconds
expr min lq mean median uq max neval
reg1(dataset) 75.52479 85.50742 87.80560 87.57180 89.59216 96.34956 100
reg2(dataset) 83.98896 85.51443 87.40334 87.00544 88.84889 94.01787 100
reg3(dat) 61.00551 86.01789 88.15627 88.13501 90.48899 95.05454 100
【问题讨论】:
-
关于避免复制的段落的后半部分是:“对 R 3.1.0 的更改已大大降低了这种使用的重要性,因为修改列表不再产生深层复制。以前,修改单个元素如果某些元素很大,则列表中的每个元素都会被复制,这是一项昂贵的操作。现在,修改列表可以有效地重用现有向量,从而节省大量时间。”
-
列表有引用语义吗?将列表传递给函数进行分析与传递引用一样有效吗?如果是这样,很高兴看到一个例子。
-
如果你想了解 R 和性能,我强烈推荐 this 开源书籍,特别是 performance 和 memory 上的部分
标签: r shiny bioconductor