2013-08-18 3 views
8

script.Aを実行した場合:Rスクリプトがロードされたパッケージ内の関数を使用したかどうかを簡単に知る方法はありますか?例えば

library(ggplot2) 
a <- 12 

、その後script.B

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

私はscript.Bがしたのに対し、script.Aは、実際に、ggplot2の使用をしなかったことを伝えることができると思います。

1)まず問題あなたはではないのためにテストしたいん各パッケージのlibrary()コール:

+0

機能の由来を知る必要がありますか? – Thomas

+0

私が実際にやりたいことは、使用されていないパッケージを排除することです。私は古いプロジェクトのコードを再利用するので、私はいつもパッケージを追加しているようですが、未使用のパッケージを見つけるために何らかのバイセクトを手動で行うことはできますが、これは面倒です。理想的には、実際に呼び出されたものの実行後実行を取得することができます。 –

+1

これらのヘルプを実行してください:http://stackoverflow.com/questions/8761857/identifying-dependencies-of-r-functions-and-scripts and http://stackoverflow.com/questions/17402735/between-function-possible -improvement – Thomas

答えて

0

はこれを試してみてください。この場合、テストしたいパッケージが1つしかないので、このステップをスキップできます。 libraryが出dummiedで

2)スクリプトを実行します。あなたがエラーを取得しない場合、スクリプトはパッケージに依存しない

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

+1

私はスクリプトに 'base :: library()'を入れました:-) –

+1

名前空間のインポートはどうですか?ロードされた別のパッケージに何かがインポートされたため、エラーは発生しない可能性があります。恐らく希少ですが、可能です。 – Thomas

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 

注意。

関連する問題