【问题标题】:How to see which R package or function has loaded another R package via namespace如何通过命名空间查看哪个 R 包或函数已加载另一个 R 包
【发布时间】:2018-08-01 06:37:49
【问题描述】:

我有一个复杂的 R Shiny 应用程序(由其他人开发)要调试,其中一个线索是,在其操作的某个时刻,它通过命名空间加载了一个 R 包(它恰好是 shinyjs,但这并不重要问题)。我已经找到并运行了对library()require() 的所有显式调用,并且在干净的会话shinyjs 中运行它们后not 出现在sessionInfo() 中。而如果我中断应用程序并运行 sessionInfo() 它确实会出现。因此,其他软件包之一必须在其“建议”字段中包含shinyjs,然后显式调用它。为了解决我的错误,我想找出应用程序的哪个部分正在执行此操作,它正在使用哪些功能,以及建议 shinyjs 的软件包。

在项目中没有明确使用字符串“shinyjs”,因此必须埋在应用程序使用的(许多)包之一中,例如shinyjs::some_function()。我的问题是如何找到哪个包和哪个功能。

那么,我如何(如果有的话)通过查看 R 会话来检测哪个包和函数称为 R 包,导致它通过命名空间加载?

【问题讨论】:

  • 卸载shinjs,然后运行直到出现错误?
  • 谢谢@Axeman,我试过了,问题是 Shiny 对它遇到问题的确切位置没有帮助(有很多文件,而且都是高度模块化的)。

标签: r debugging namespaces


【解决方案1】:

您可以使用tools:package_dependencies 了解您已安装或正在使用哪些软件包,它们的依赖项中有shinyjs

# Example with all my packages
library(tools)
xx <- package_dependencies(available.packages())
names(xx)[unlist(lapply(xx, function(x) "shinyjs" %in% x))]
 [1] "addinslist"                "AFM"                       "airGRteaching"             "bairt"                    
 [5] "blkbox"                    "colourpicker"              "CRANsearcher"              "ddpcr"                    
 [9] "dextergui"                 "dragulaR"                  "dtwclust"                  "Eagle"                    
[13] "eechidna"                  "elementR"                  "genBart"                   "genogeographer"           
[17] "ggExtra"                   "ggquickeda"                "gimmeTools"                "GMSE"                     
[21] "GWSDAT"                    "lightsout"                 "meltt"                     "memapp"                   
[25] "mrMLM.GUI"                 "npregfast"                 "ProjectionBasedClustering" "projector"                
[29] "regexSelect"               "ShinyImage"                "ShinyItemAnalysis"         "shinyKGode"               
[33] "shinystan"                 "skpr"                      "SpatialEpiApp"             "spectrolab"               
[37] "spotGUI"                   "stmgui"                    "stminsights"               "Umatrix"                  
[41] "wallace"                   "wilson"                    "wppExplorer"               "xROI"                     
[45] "yuimaGUI"  

探索其运行位置的另一个选项是trace 函数。 shinyjs 没有很多功能,因此您可以查看代码的哪些部分正在使用它的某些功能以及使用了多少次。

# Example with the function sum
> trace (sum)
> x <- seq (1, 10)
> hist (x)
trace: sum
trace: sum
> y <- sqrt (x)
> lm <- lm (x ~ y)
trace: sum
trace: sum
trace: sum
trace: sum
trace: sum
trace: sum
trace: sum
trace: sum
trace: sum
> untrace (sum)

我知道这不是对您问题的具体答案,但这样您就可以更接近使用包的位置。

【讨论】:

    猜你喜欢
    • 2018-04-27
    • 2019-12-28
    • 2013-11-19
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2015-06-10
    • 2018-01-30
    相关资源
    最近更新 更多