如何查看哪个R包或函数已通过命名空间加载了另一个R包

时间:2018-08-01 06:37:49

标签: r debugging namespaces

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

项目中没有显式使用字符串“ shinyjs”,因此必须将应用程序使用的shinyjs包埋在其中的多个包中。我的问题是如何找到哪个包和哪个功能。

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

1 个答案:

答案 0 :(得分: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)

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