2014-09-23 64 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))]