【问题标题】:Searching functions using grep over multiple loaded packages in R在 R 中使用 grep 在多个加载的包上搜索函数
【发布时间】:2016-09-14 06:22:38
【问题描述】:

假设我使用 sapply() 加载了包 basedplyrdata.tabletidyr 等。

 sapply(c("dplyr","data.table","tidyr"),library,character.only=TRUE)

所以要检查我做的特定包中的函数列表

 ls("package:data.table")

现在,如果我想在 dplyr 中搜索以 is. 模式开头的函数,我会这样做

 grep("is\\.",ls("package:dplyr"),value=TRUE)
 # [1] "is.grouped_df" "is.ident"      "is.sql"        "is.src"       
 # [5] "is.tbl" 

我的目标是同时在多个包中搜索以is.as. 或任何其他模式开头的所有函数。我认为代码会很长,即下面我结合了 dplyrbase 函数的列表,然后添加了 grep 模式。很多加载的包怎么办?

 grep("is\\.",c(ls("package:dplyr"),ls("package:base")),value=T)

函数search() 会给我加载包的列表。但是如何把加载的包的所有功能都收集起来,方便我以后grep就可以了。

对于单个包,函数列表可以通过

 ls("package:package_name")  

非常感谢任何帮助。

【问题讨论】:

    标签: r regex pattern-matching


    【解决方案1】:

    要获取所有已加载包的列表,请使用:

    x <- grep('package:',search(),value=TRUE)  # Comment below by danielson
    # e.g. ("package:base", "package:data.table")
    
    sapply(x, function(x) {
        paste0(x, ":", grep("is\\.", ls(x),value=TRUE))
    })
    

    输出:

    $`package:base`
     [1] "package:base:is.array"              "package:base:is.atomic"
     [3] "package:base:is.call"               "package:base:is.character"
     [5] "package:base:is.complex"            "package:base:is.data.frame"
     [7] "package:base:is.double"             "package:base:is.element"
     ...
    
    $`package:data.table`
    [1] "package:data.table:is.data.table"
    

    【讨论】:

    • 我喜欢这个答案。但是,假设有 100 个使用 library 加载的包。现在要查看已加载的包列表,我在控制台上说search()。我不能坐在c() 里面写 100 个,所以我需要一个 x 更大并且很容易组合的答案。
    • @SowmyaS.Manian 我同意您需要一种方法来获取已安装软件包的列表。为此,请使用installed.packages()[,1]。关于结合结果,我认为我给出的输出是合理的。通常,您总是必须通读一些文档来选择函数或方法,并且您的用例与 AFAIK 没有任何不同。
    • 我们也可以像x &lt;- search()[-1] 那样做,然后在sapply() 内部做些小改动。几乎解决了我的问题。
    • x &lt;- grep('package:',search(),value=TRUE) 在上面的代码中?
    • 为什么不删除grep 并在ls() 中使用pattern 参数? ls("package:base", pattern = "is\\.")
    【解决方案2】:

    谢谢大家。所以这里是我在这里发布的问题的 3 个版本的答案

    注意:优先级是在多个加载的包上搜索一个模式,您可以搜索其他模式而不是“is”。

    版本 1

     ## Get list of loaded packages into X 
    
     X <- grep('package:',search(),value=TRUE)  # Comment by danielson
    
     # Use grep to find functions with is. pattern over multiple loaded packages inside X
    
     sapply(X, function(X) {
     paste0(X, ":", grep("is\\.", ls(X),value=TRUE))
     })
    

    第 2 版

     ## Get list of loaded packages into X 
    
     X <- .packages()    # Comment by docendo discimus
    
     # Use grep to find functions with is. pattern over multiple loaded packages inside X
    
     sapply(X, function(X) {
     paste0(X, ":", grep("is\\.", ls(paste0("package:",X)),value=TRUE))
     })
    

    版本 3 - 没有 grep() 函数

     ## Get list of loaded packages into X 
    
     X <- .packages()
    
     # find functions using `ls()` with is. pattern over multiple loaded packages inside X
     # Suggested by Rich Scriven Over Comments
    
     sapply(X, function(X) { 
     paste0(X,":",ls(paste0("package:",X), pattern = "is\\."))
     })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多