我正在尝试获取基础包中所有函数名称的向量,其中只包含.
作为标点符号,或者根本没有标点符号。我只想使用ls()
函数。
ls()
采用定义为
pattern
参数
可选的正则表达式。仅返回匹配模式的名称。
glob2rx
可用于将通配符模式转换为正则表达式。
我正试图反转我的正则表达式。但我也希望保留包含.
的函数。这是我不想要的一些例子。
lsBase1 <- ls("package:base", pattern = "[[:punct:]]")
head(lsBase1)
# [1] "^" "~" "<" "<<-" "<=" "<-"
我想要这个的反转版本,好像我在invert = TRUE
中使用grep
,或者执行以下操作。 但是我还想要包含.
的函数,如果它们包含标点符号。
lsBase2 <- ls("package:base")
lsBase2 <- lsBase[!grepl("[[:punct:]]", lsBase)]
head(lsBase2)
# [1] "abbreviate" "abs" "acos" "acosh"
# [5] "addNA" "addTaskCallback"
有没有办法反转pattern
中的ls()
参数?或者,更一般地,我可以反转正则表达式[[:punct:]]
,以便它返回相反的,但包括那些仅包含.
作为标点符号的匹配项?
注意:不止一个.
没问题。
我想要的另一个例子是:是的我想要is.vector
但是我不想要[.data.frame
。
答案 0 :(得分:5)
我相信这就是你要找的东西:
m <- ls("package:base", pattern="^(\\.|[^[:punct:]])*$")
|
是&#34; OR&#34;的正则表达式,所以在单词中,它表示类似于#34;匹配从字符串的开头到结尾的字符序列,每个都是.
,或者不是标点符号&#34;。
确认这是有效的:
## 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<-"
答案 1 :(得分:3)
以下内容适用于您所要求的内容。
> lsBase2[grepl('^([^\\pP\\pS]|\\.)+$', lsBase2, perl=T)]
编辑:或者您可以简单地使用以下(R版本3.1.1)返回1029
结果:
> ls("package:base", pattern="^[a-zA-Z0-9.]+$")
答案 2 :(得分:0)
如果您分步考虑,这很容易。首先删除.
个字符,然后扫描其他标点符号:
lsBase2[!grepl('[[:punct:]]', gsub('[.]', '', lsBase2))]