2014-09-23 28 views
3

我试图获得只包含.作为标点符号或根本没有标点符号的所有函数名称的矢量。我只想使用ls()函数。ls()中的模式参数可以颠倒吗?

ls()需要被定义为

可选正则表达式pattern参数。只返回名称匹配模式。 glob2rx可用于将通配符模式转换为正则表达式。

我想反转我的正则表达式。但我也想保留包含.的函数。以下是我不想要的一些例子。

lsBase1 <- ls("package:base", pattern = "[[:punct:]]") 
head(lsBase1) 
# [1] "^" "~" "<" "<<-" "<=" "<-" 

我想这倒版本,如果我在grep使用invert = TRUE,或通过执行以下操作。 但是我还希望只包含.的函数包含标点符号。

lsBase2 <- ls("package:base") 
lsBase2 <- lsBase[!grepl("[[:punct:]]", lsBase)] 
head(lsBase2) 
# [1] "abbreviate"  "abs"    "acos"   "acosh"   
# [5] "addNA"   "addTaskCallback" 

有没有办法来反转在ls()pattern说法?或者,更一般地说,我可以反转正则表达式[[:punct:]],以便返回相反的结果,但包含那些仅包含.作为标点符号的匹配项?

注意:超过一个.是好的。

我想要的另一个例子是:我想要is.vector但我不想要[.data.frame

+0

在大多数的功能在'包:base','.'表示该函数是一个S3方法。这是你的标点符号吗? – mnel 2014-09-23 03:38:07

+0

是的,那也可以。但我真的希望尽可能少地做到这一点。'ls()'只有在真正有可能的情况下 – 2014-09-23 03:41:08

+2

使用源代码。如果指定'pattern','ls'基本上只调用'grep'。所以你可以简单地做到这一点,并且像你想要的那样指定'invert = TRUE'。 – 2014-09-23 03:41:11

回答

5

我相信这是你在找什么:

m <- ls("package:base", pattern="^(\\.|[^[:punct:]])*$") 

|是正则表达式为“OR”,那么在口头上,它表示“匹配一系列字符,从字符串的开头到结尾,每个字符都是.,OR不是标点字符”。


要确认此工作的:

## Dissolve the matched strings and check for any verboten characters. 
sort(unique(unlist(strsplit(m, "")))) 
# [1] "." "0" "1" "2" "3" "4" "8" "a" "A" "b" "B" "c" "C" "d" "D" "e" 
# [17] "E" "f" "F" "g" "G" "h" "H" "i" "I" "j" "J" "k" "K" "l" "L" "m" 
# [33] "M" "n" "N" "o" "O" "p" "P" "q" "Q" "r" "R" "s" "S" "t" "T" "u" 
# [49] "U" "v" "V" "w" "W" "x" "X" "y" "Y" "z" 

## Have a look at (at least a few of) the names _excluded_ by the regex: 
n <- setdiff(ls("package:base"), m) 
sample(n, 10) 
# [1] "names<-.POSIXlt" "[[<-.data.frame" "!.hexmode"  "$<-"    
# [5] "<-"    "&&"    "%*%"    "package_version" 
# [9] "$"    "regmatches<-" 
+0

这正是我想要的......现在我该如何确认它。哈哈,开个玩笑吧。 – 2014-09-23 03:52:07

+0

我其实并不认真。但是谢谢你! – 2014-09-23 04:08:41

+0

+1我喜欢解释的程度=) – hwnd 2014-09-23 04:12:25

3

以下内容适用于您要求的内容。

> lsBase2[grepl('^([^\\pP\\pS]|\\.)+$', lsBase2, perl=T)] 

编辑:或者你可以简单地使用以下(R版本3.1.1)返回1029结果在这:

> ls("package:base", pattern="^[a-zA-Z0-9.]+$") 
+0

有人会认为如果提供了'pattern'参数,那么'perl'参​​数也会被提供。奇怪的是,它不是'ls'那样的那样 – 2014-09-23 04:04:07

0

这是很容易,如果你在步骤去想它。首先拆下.字符,然后扫描额外的标点:

lsBase2[!grepl('[[:punct:]]', gsub('[.]', '', lsBase2))]