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

时间:2012-02-28 15:39:00

标签: r detach

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

4 个答案:

答案 0 :(得分:14)

我猜您正在搜索search()命令。这应该显示您附带的附加数据框和包。

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

答案 1 :(得分:10)

使用search()找出附加的对象。

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

附加mtcars

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

    mpg

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

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

答案 2 :(得分:4)

要避免此问题,最好不要对数据集使用附加和分离。您还可能遇到在2个或更多附加数据集(可能还有全局环境)中定义相同变量并且意外得到错误的变量的问题。最好将数据参数用于plotlm等函数,并将withwithintransform等函数用于其他情况。然后,R将始终首先查看指定的数据集,然后不再将其附加。

答案 3 :(得分:3)

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

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

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

intersect(search(), objects())

如果你得到&#34;字符(0)&#34; - 全局环境中没有附加数据对象

2。自动&#34;清理&#34; &安培;分离所有附加数据集

此代码将获取附加数据集的列表并分离所有附加对象(数据集)。它应该留下非物体。因此,这是一种相当简单,安全,可靠的方式来清理&#34;全球环境:

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

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

3。即使多次附加对象也会分离所有

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

所以:

attach(data.df)
intersect(search(), objects())

attach(data.df)
attach(data.df)
attach(data.df)
intersect(search(), objects())

将产生相同的输出: [1]&#34; data.df&#34;

即使后一种情况需要调用三次detach(data.df)来清除全球环境。因此,我们需要将第2部分的答案放在循环中。

3(b)为用户生成输出 此外,清理将为每个成功的&#34; detach()&#34;输出数据集名称列表。操作。这样,用户就可以知道分离了哪些数据集以及分解了多少次。

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

# 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}
}