1

另一个问题的答案解释了如何匹配不包含单词的字符串

问题(对我来说)是给出的解决方案在 R 中不起作用。

我经常从现有向量创建一个data.frame()并想清理我的工作区。例如,如果我的工作区包含:

> ls()
[1] "A"   "B"   "dat" "V"
>

我只想保留dat,我必须清理它:

> rm(list=ls(pattern="A"))
> rm(list=ls(pattern="B"))
> rm(list=ls(pattern="V"))
> ls()
[1] "dat"
> 

(其中AB、 和V只是大量复杂名称的示例,my.first.vector不容易与 匹配rm(list=ls(pattern="[ABV]")))。

(对我来说)告诉rm()删除除 之外的所有内容是最方便的dat,但问题是链接的问答中给出的解决方案不起作用:

> rm(list=ls(pattern="^((?!dat).)*$"))
Error in grep(pattern, all.names, value = TRUE) : 
  invalid regular expression '^((?!dat).)*$', reason 'Invalid regexp'
> 

那么我如何匹配datR 之外的所有内容?

4

2 回答 2

4

Negative look-around需要perl=TRUER 中的参数。因此,您将无法直接使用ls(pattern = ...)该正则表达式。或者,您可以这样做:

rm(list = grep("^((?!dat).)*$", ls(), perl=TRUE, value=TRUE))

这是如果您正在寻找不精确的匹配项。如果您正在寻找完全匹配,您应该按照费迪南德的评论:

rm(list=ls()[ls() != "dat"])
于 2013-07-03T16:42:06.603 回答
4

这将删除除dat. (如果要删除名称也以点开头的对象,请使用该ls参数。)all.names = TRUE

rm( list = setdiff( ls(), "dat" ) )

替换"dat"为名称向量,例如c("dat", "some.other.object"),如果要保留多个对象;或者,如果多个对象都可以通过正则表达式轻松匹配,请尝试这样的操作,删除名称不以 开头的所有对象"dat"

rm( list = setdiff( ls(), ls( pattern = "^dat" ) ) )

另一种方法是保存数据,save("dat", file = "dat.RData")退出 R,启动新的 R 会话并加载数据,1oad("dat.RData")。另请注意这种重新启动 R 的方法。

于 2013-07-03T16:54:16.903 回答