有没有一种简单的方法来判断R脚本是否使用了加载包中的任何函数?

有没有一种简单的方法来判断R脚本是否使用了加载包中的任何函数?,r,R,例如,如果运行脚本.A: library(ggplot2) a <- 12 我可以看出script.A实际上没有使用ggplot2,而script.B使用了 试试这个: 1) 首先为您不想测试的每个包发出一个library()调用。在这种情况下,只有一个包是我们希望测试的包,因此我们可以跳过这一步 2) 使用库运行脚本 library <- list source("script.A") rm(library) # restore library正常加载库,并跟踪包环境(以

例如,如果运行
脚本.A

 library(ggplot2)
 a <- 12 
我可以看出
script.A
实际上没有使用
ggplot2
,而
script.B
使用了

试试这个:

1) 首先为您不想测试的每个包发出一个
library()
调用。在这种情况下,只有一个包是我们希望测试的包,因此我们可以跳过这一步

2) 使用
库运行脚本

library <- list
source("script.A")
rm(library) # restore

library正常加载库,并跟踪包环境(以及命名空间)中的所有函数。我将使用一个小的助手函数来完成此操作:

trap_funs <- function(env)
{
    f <- sapply(as.list(env, all.names=TRUE), is.function)
    for( n in names(f)[f] ) trace(n, bquote(stop(paste("Script called function", .(n)))), where=env)
}
需要第二条语句来确保
data.table::xxx()
等调用也被捕获

例如:

library(data.table)
trap_funs(as.environment("package:data.table"))
trap_funs(asNamespace("data.table"))
> as.data.table(mtcars)
Tracing as.data.table(mtcars) on entry 
Error in eval(expr, envir, enclos) : Script called function as.data.table

请注意,代码被中断。

您需要知道函数来自哪个包吗?我实际上想做的是消除未使用的包。当我重复使用旧项目中的代码时,我似乎总是添加(但从不删除)包,虽然我可以手动进行某种对分以查找未使用的包,但这将是一个麻烦。理想情况下,我可以在执行后运行实际调用的内容。执行以下任何一项帮助:我将
base::library()
放在脚本中:-)命名空间导入呢?您可能不会收到错误,因为某些内容已导入到另一个加载的包中。可能很少见,但似乎有可能。
> as.data.table(mtcars)
Tracing as.data.table(mtcars) on entry 
Error in eval(expr, envir, enclos) : Script called function as.data.table