有什么方法R
可以找出附加了哪些数据集。在我的工作流程中,我使用控制台并构建一个脚本。我在控制台中尝试了代码行,一旦对结果感到满意,我会将它们添加到脚本中,以便稍后重现结果。在过去的一周里,我一直在玩一些数据集。我想我随着时间的推移连接和分离了其中的一些。但是现在我需要知道当前附加了哪些数据集,以便我可以分离它们。
4 回答
我猜你正在搜索search()
命令。这应该显示您包含的附加数据框和包。
还键入help(search)
并检查它在做什么。
用于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"
为了使答案与评论中的建议保持一致,我将代码分为三个部分。第一个只是生成附加数据集的列表。第二个删除附加数据集的单个实例。第三个处理数据集已被多次附加的情况:
1. 附加数据集的输出列表
此代码将生成附加数据集列表供用户检查:
intersect(search(), objects())
如果你得到“字符(0)” - 全局环境中没有附加数据对象
2.自动“清理”并分离所有附加的数据集
此代码将获取附加数据集的列表并分离所有附加对象(数据集)。它应该不理会非对象。因此,这是一种相当简单、安全、可靠的“清理”全球环境的方法:
注意:这仅在每个对象仅附加一次时才有效,否则您将不得不再次运行该命令。答案的下一部分也处理这种情况。
#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] "data.df"
即使后一种情况需要detach(data.df)
调用 3 次才能清除全球环境。因此,我们需要将第 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}
}
为了避免这个问题,最好不要对数据集使用附加和分离。您还可能遇到在 2 个或更多附加数据集(可能还有全局环境)中定义相同变量并意外获取错误变量的问题。最好将 data 参数用于plot
和lm
等函数,并在其他情况下使用with
、within
和transform
等函数。然后 R 将始终首先在指定的数据集中查找,然后不会将其附加。