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

时间:2013-08-18 15:25:03

标签: r

例如,如果运行script.A

 library(ggplot2)
 a <- 12 

然后script.B

library(ggplot2)
b <- runif(100)
qplot(b) 

我可以告诉script.A实际上没有使用ggplot2,而script.B却没有。

2 个答案:

答案 0 :(得分:5)

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

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)
}

示例:

library(data.table)
trap_funs(as.environment("package:data.table"))
trap_funs(asNamespace("data.table"))

需要第二个声明来确保data.table::xxx()之类的呼叫也被捕获。

示例:

> as.data.table(mtcars)
Tracing as.data.table(mtcars) on entry 
Error in eval(expr, envir, enclos) : Script called function as.data.table

请注意,代码已中断。

答案 1 :(得分:0)

试试这个:

1)首先针对您 NOT 想要测试的每个包发出library()调用。在这种情况下,只有一个包是我们要测试的包,所以我们可以跳过这一步。

2)使用library dummied out

运行脚本
library <- list
source("script.A")
rm(library) # restore

如果没有错误,则脚本不依赖于包。