从R脚本中提取包名称

时间:2018-01-19 21:22:05

标签: r regex

我正在尝试编写一个函数来从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?我尝试了很多选项,但我的所有结果都是空的。

2 个答案:

答案 0 :(得分:3)

由于两个原因,您的第二个grep不会返回1,2。

  1. 您使用了value = TRUE,这使得它返回匹配的字符串而不是 地点。和
  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()