有没有一种简单的方法来判断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