确定使用哪些包

时间:2015-12-11 16:52:33

标签: r

是否有快速扫描R脚本并确定实际使用哪些包的方法?我的意思是查看脚本中调用的所有函数并返回包含这些函数名的包列表? (我知道函数名称不是任何一个包独有的)

为什么不查看library()require()调用的包?对。好吧,我习惯于加载我经常使用的包,无论我是否在脚本中实际使用它们。

我想通过删除未使用的软件包清理一些我打算与他人分享的脚本。

我决心在2016年改变我的方式。请帮助我开始。

更新

评论中的一些好主意......

# create an R file that uses a few functions

fileConn<-file("test.R")
writeLines(c("df <- data.frame(v1=c(1, 1, 1), v2=c(1, 2, 3))",
             "\n",
             "m <- mean(df$v2)",
             "\n",
             "describe(df)  #psych package"),
           fileConn)
close(fileConn)

# getParseData approach
pkg <- getParseData(parse("test.R"))
pkg <- pkg[pkg$token=="SYMBOL_FUNCTION_CALL",]
pkg <- pkg[!duplicated(pkg$text),]
pkgname <- pkg$text
pkgname
# [1] "data.frame" "c"          "mean"       "describe" 

更新2

实施@ nicola的想法的丑陋尝试:

# load all probable packages first
pkgList <- list(pkgname)
for (i in 1:length(pkgname)) {
  try(print(packageName(environment(get(pkgList[[1]][i])))))
}

它不喜欢c()函数,但结果看起来不正确。

#[1] "base"
#Error in packageName(environment(get(pkgList[[1]][i]))) : 
#  'env' must be an environment
#[1] "base"
#[1] "psych"

1 个答案:

答案 0 :(得分:1)

基于问题评论中的想法的答案。关键功能是getParseData()packageName()

# create an R file that uses a few functions

fileConn<-file("test.R")
writeLines(c("df <- data.frame(v1=c(1, 1, 1), v2=c(1, 2, 3))",
             "\n",
             "m <- mean(df$v2)",
             "\n",
             "describe(df)  #psych package"),
           fileConn)
close(fileConn)

# getParseData approach
pkg <- getParseData(parse("test.R"))
pkg <- pkg[pkg$token=="SYMBOL_FUNCTION_CALL",]
pkg <- pkg[!duplicated(pkg$text),]
pkgname <- pkg$text
pkgname
# [1] "data.frame" "c"          "mean"       "describe" 

# load all probable packages first
pkgList <- list(pkgname)
for (i in 1:length(pkgname)) {
  try(print(packageName(environment(get(pkgList[[1]][i])))))
}

#[1] "base"
#Error in packageName(environment(get(pkgList[[1]][i]))) : 
#  'env' must be an environment
#[1] "base"
#[1] "psych"

我现在将此标记为正确,但很高兴考虑其他解决方案。