data(-6ren">
gpt4 book ai didi

r - 使用data()从 "R"包中加载数据集,直接赋值给一个变量?

转载 作者:行者123 更新时间:2023-12-04 19:49:30 28 4
gpt4 key购买 nike

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

最佳答案

使用辅助函数:

# 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您的数据添加 LazyData: true在包的说明文件中。

如果您使用 RStudio ,运行后 data("faithful") ,您会在 Environment 看到“忠实”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 .

关于r - 使用data()从 "R"包中加载数据集,直接赋值给一个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30951204/

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