如何使用data()
函数从R包加载数据集,并将其直接分配给变量而不在环境中创建重复副本?
简单地说,如果不在您的环境中创建两个相同的dfs,您可以这样做吗?
> data("faithful") # Old Faithful Geyser Data from datasets package
> x <- faithful
> ls() # Now I have 2 identical dfs - x and faithful - in my environment
[1] "faithful" "x"
> remove(faithful) # Now I've removed one of the redundant dfs
尝试1:
我的第一个方法是将data("faithful")
分配给x
。但data()
返回一个字符串。所以现在我的环境中有df faithful
和字符向量x
。
> x <- data("faithful")
> x
[1] "faithful" # String, not the df "faithful" from the datasets package
> ls()
[1] "faithful" "x"
尝试2: 试图在我的第二次尝试中变得更加复杂。
> x <- get(data("faithful")) # This works as far as assignment goes
> ls() # However I still get the duplicate copy
[1] "faithful" "x"
关于我尝试这样做的动机的简短说明。我有一个包含5个非常大的data.frames的R包 - 每个都有相同的列。我想在所有5个data.frames上有效地生成相同的计算列。因此,我想在data()
构造函数中使用list()
将5个data.frames放入列表中。然后我想使用llply()
包中的mutate()
和plyr
迭代列表中的dfs,并为每个df创建计算列。但是我不希望在我的环境中拥有5个大型数据集的重复副本,因为它位于具有RAM限制的Shiny应用程序中。
修改 我能够从他的答案中使用@ henfiber的两种方法来弄清楚如何将整个data.frames延迟加载到命名列表中。
这里的第一个命令用于将data.frame分配给新的变量名。
# this loads faithful into a variable x.
# Note we don't need to use the data() function to load faithful
> delayedAssign("x",faithful)
但我想创建一个包含x
,y = data(faithful)
等元素的命名列表z=data(iris)
。
我尝试了下面的内容并没有用。
> x <- list(delayedAssign("y",faithful),delayedAssign("z", iris))
> ls()
[1] "x" "y" "z" # x is a list with 2 nulls, y & z are promises to faithful & iris
但我终于能够以下列方式构建一个延迟加载的data.frame对象列表:
# define this function provided by henfiber
getdata <- function(...)
{
e <- new.env()
name <- data(..., envir = e)[1]
e[[name]]
}
# now create your list, this gives you one object "x" of class list
# with elements "y" and "z" which are your data.frames
x <- list(y=getdata(faithful),z=getdata(iris))
答案 0 :(得分:3)
使用辅助功能:
# define this function
getdata <- function(...)
{
e <- new.env()
name <- data(..., envir = e)[1]
e[[name]]
}
# now load your data calling getdata()
x <- getdata("faithful")
或使用匿名函数:
x <- (function(...)get(data(...,envir = new.env())))("faithful")
您还应该考虑lazy loading
您的数据在包的DESCRIPTION文件中添加LazyData: true
。
如果您使用RStudio
,则在运行data("faithful")
后,您会在Environment
面板上看到&#34;忠实的&#34; data.frame被称为"promise"
(另一个不常见的名称是"thunk"
)并且是灰色的。这意味着它被R懒惰地评估并且仍未加载到内存中。您甚至可以使用"x"
函数延迟加载delayedAssign()
变量:
data("faithful") # lazy load "faithful"
delayedAssign("x", faithful) # lazy assign "x" with a reference to "faithful"
rm(faithful) # remove "faithful"
尚未将任何内容加载到内存中
summary(x) # now x has been loaded and evaluated
详细了解lazy evaluation
here。
答案 1 :(得分:1)
为什么不使用这样的简单解决方案:
x <- list(y = datasets::faithful, z = datasets::iris )