首页 > 解决方案 > 在 R 中保存与模式不匹配的对象

问题描述

我想将全局环境中的大多数对象保存到一个文件中,使用save(). 我想排除的对象可以用一个简单的正则表达式匹配,但据我所知,不能使用 perl 风格的正则表达式的pattern参数ls(),所以我不能使用负前瞻匹配。

有没有一种直接的方法来保存一些对象,同时排除一些与正则表达式匹配的对象?

这是一个玩具示例。在现实生活中,要保存的对象的名称差异很大,而且它们太多了,无法全部匹配:

# objects to save
foo  <- c(1:10)
bar  <- c(10:20)
foobar  <- c(foo, bar)
asdf_uyi  <- 100
qwer2bcdefg  <- "some letters"

# don't save these
meh  <- c(20:30)
meh2  <- meh * 2

# try to save everything that DOESN'T match "meh"
#    this throws an 'Invalid regexp' error because ls() doesn't support negative lookaheads
save(file = "not-meh.RData", list = ls(pattern = ("^(?!meh)"))

标签: rregex

解决方案


如果没有 perl 正则表达式(但是您可以添加perl=TRUEgrepl(), 因为它不会错):

save(file = "not-meh.RData", list = ls()[!grepl("^meh", ls())])

使用 perl 负查找正则表达式:

save(file = "not-meh.RData", list = ls()[grepl("^(?!meh)", ls(), perl=TRUE)])

推荐阅读