如何在R中找到附加数据集的列表?

Sam*_*Sam 8 r detach

是否有任何方法R可以找出附加了哪些数据集.在我的工作流程中,我使用控制台并构建脚本.我在控制台中尝试了代码行,一旦我对结果感到满意,我就将它们添加到脚本中,以便我可以在以后重现结果.在过去的一周里,我一直在玩一些数据集.我想我随着时间的推移附加了一些它们.但是现在我需要知道当前附加了哪些数据集,以便我可以将它们分离.

小智 14

我猜你正在寻找这个search()命令.这应该显示您包含的附加数据框和包.

还要输入help(search)并检查它在做什么.


And*_*rie 10

使用search()找出哪些对象连接.

由于这也会告诉您所有附加的包,您可以使用正则表达式从搜索结果中删除包:

mtcars:

attach(mtcars)
The following object(s) are masked from 'package:ggplot2':

    mpg
Run Code Online (Sandbox Code Playgroud)

现在使用search()和正则表达式:

attached <- search()
attached[!grepl("package", attached)]
[1] ".GlobalEnv"    "mtcars"        "tools:rstudio" "Autoloads" 
Run Code Online (Sandbox Code Playgroud)


Hon*_*dha 6

为了使答案与评论中的建议一致,我将代码分成三个部分。第一个简单地生成一个附加数据集的列表。第二个删除附加数据集的单个实例。第三个处理数据集被多次附加的情况:

1. 附加数据集的输出列表

此代码将生成一个附加数据集列表供用户检查:

intersect(search(), objects())

如果你得到“character(0)”——全局环境中没有附加数据对象

2.自动“清理”并分离所有附加的数据集

此代码将获取附加数据集的列表并分离所有附加对象(数据集)。它应该不理会非对象。因此,这是一种相当简单、安全且可靠的“清理”全球环境的方法:

注意:这仅在每个对象仅附加一次时才有效,否则您将不得不再次运行该命令。答案的下一部分也处理这种情况。

#works if only attached each object once
lapply(X = intersect(search(), objects()), 
FUN = function(X){detach(name = X, character.only = TRUE)})
Run Code Online (Sandbox Code Playgroud)

3.即使多次附加对象,也要全部分离

3(a) 多个附件 此代码将分离所有附加的对象(数据集),即使它们已被多次附加。上面的操作无法处理这个,因为 R 不会包含对象的名称两次,即使它已经被用户附加了两次。

所以:

attach(data.df)
intersect(search(), objects())
Run Code Online (Sandbox Code Playgroud)

和,

attach(data.df)
attach(data.df)
attach(data.df)
intersect(search(), objects())
Run Code Online (Sandbox Code Playgroud)

将产生相同的输出:[1] "data.df"

即使后一种情况需要detach(data.df)调用 3 次才能清除 Global Environment。因此,我们需要将第 2 部分的答案放在一个循环中。

3(b) 为用户生成输出 此外,清理将为每个成功的“detach()”操作输出一个数据集名称列表。这让用户知道哪些数据集被分离以及分离了多少次。

注意:我相信这可以稍微清理一下,但是这段代码可以可靠地完成工作。

# the repeat handles cases where objects of identical name were 
# attached (or, object was attached twice by mistake). 
# It also outputs the name of objects as they are detached. 

repeat{
  x <- lapply(X = intersect(search(), objects()),
         FUN = function(X){detach(name = X, character.only = TRUE)})

  y <- lapply(x, function(X){cat(attr(X,"name"), "\n")})

  if(identical(x, list())){break}
}
Run Code Online (Sandbox Code Playgroud)