我正在尝试编写一个函数来从R脚本文件列表中提取包名称。我的正则表达似乎不起作用,我不知道为什么。对于begginers,我无法匹配包含library
的行。例如
str <- c(" library(abc)", "library(def)", "some other text")
grep("library\\(", str, value = TRUE)
grep("library\\(+[A-z]\\)", str, value = TRUE)
为什么我的第二个grep
不会从str
向量返回元素1和2?我尝试了很多选项,但我的所有结果都是空的。
答案 0 :(得分:3)
由于两个原因,您的第二个grep
不会返回1,2。
grep("library\\(\\w+\\)", str)
答案 1 :(得分:1)
如果您想要更强大的功能来处理某些边缘情况(library()
需要一些参数,package
可以是名称/符号或字符串,不一定必须先指定):
library(purrr)
script <- '
library(js) ; library(foo)
#
library("V8")
ls()
library(package=rvest)
TRUE
library(package="hrbrthemes")
1 + 1
library(quietly=TRUE, "ggplot2")
library(quietly=TRUE, package=dplyr, verbose=TRUE)
'
x <- parse(textConnection(script)) # parse w/o eval
keep(x, is.language) %>% # `library()` is a language object
keep(~languageEl(.x, 1) == "library") %>% # other things are too, so only keep `library()` ones
map(as.call) %>% # turn it into a `call` object
map(match.call, definition = library) %>% # so we can match up parameters and get them in the right order
map(languageEl, 2) %>% # language element 1 is `library`
map_chr(as.character) %>% # turn names/symbols into characters
sort() # why not
## [1] "dplyr" "foo" "ggplot2" "hrbrthemes" "js" "rvest" "V8"
这不会在函数中捕获library()
次调用(它可以扩展为执行此操作),但如果顶级边缘情况不常见,则函数中的函数可能性更小(这些函数)可能也使用require()
。