2015-12-11 4 views
5

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

の@ニコラのアイデアを実装するための醜い試み:

​​

c()機能が嫌いですが、結果は正しくないようです。

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

RStudioの[Packages]メニューですべてのパッケージを手動でオフにしてから、スクリプトを実行して見つけられない機能を確認できますか?あなたが「ああ」を認識すれば、「溶かす」には「reshape2'''」が必要です。 – Nancy

+0

おそらく 'getParseData'、概要[ここ](http://stackoverflow.com/q/33064376/324364)? – joran

+0

私はスクリプト内で呼び出された関数を決定し、それらの関数のパッケージを与える 'packageName(environment(function))'を実行しようとします。次に、読み込まれたパッケージをチェックし、実際に使用されているパッケージに直面することができます。 – nicola

答えて

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" 

私はこのようになりましに対する正しいが、他のソリューションを検討して幸せをマークします。

関連する問題