使用data()从“R”包加载数据集,将其直接分配给变量?

时间:2015-06-20 06:55:09

标签: r dataframe

如何使用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) 

但我想创建一个包含xy = 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))

2 个答案:

答案 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 )