まず、Mark Bravingtonのmvbutils
パッケージを使用する道を私に任せてくれた@ mathematical.coffeeに感謝します。 foodweb
の機能はそれ以上のものです。要約すると
、私は1つのパッケージをチェックについてについて知りたいと思った、別の対myPackage
を言う、externalPackage
は、とexternalPackage
に対してスクリプトをチェックについて言います。それぞれを行う方法を実演します。この場合、外部パッケージはdata.table
です。
1:data.table
対myPackage
については、次のコマンドで十分:
library(mvbutils)
library(myPackage)
library(data.table)
ixWhere <- match(c("myPackage","data.table"), search())
foodweb(where = ixWhere, prune = ls("package:data.table"), descendents = FALSE)
これは機能がdata.table
の関数に依存優れ示すグラフを生成します。グラフにはdata.table
の依存関係が含まれていますが、あまりにも負担はありません。に依存する関数と、それらが使用する関数、例えば,、data.table
、、key
などを簡単に見ることができます。この時点で、パッケージの依存関係の問題は解決されたと言えるかもしれませんが、foodweb
にはこれ以上のものがありますので、それを見てみましょう。クールな部分は依存関係行列です。
depMat <- foodweb(where = ixWhere, prune = ls("package:data.table"), descendents = FALSE, plotting = FALSE)
ix_sel <- grep("^myPackage.",rownames(depMat))
depMat <- depMat[ix_sel,]
depMat <- depMat[,-ix_sel]
ix_drop <- which(colSums(depMat) == 0)
depMat <- depMat[,-ix_drop]
ix_drop <- which(rowSums(depMat) == 0)
depMat <- depMat[-ix_drop,]
これはクールです:それは今私は、例えば、冗長な名前を使用しています私のパッケージに機能の依存関係を示しmyPackage.cleanData
、on functionは 、つまりdata.table
の関数ではなく、依存関係のない行と列を削除します。これは簡潔であり、依存関係を素早く調べることができ、rownames(depMat)
を処理することで、自分の関数の補集合も簡単に見つけることができます。
NB:plotting = FALSE
少なくとも最初にfoodweb
が一連の呼び出しで呼び出されたときは、プロットデバイスが作成されないようには見えません。それは面倒ですが、ひどいことではありません。たぶん私は間違ったことをしているのかもしれない
2:スクリプトの場合、data.table
に対して、これはもう少し面白いです。スクリプトごとに、一時的な関数を作成し、依存関係をチェックする必要があります。私はちょうどそれを行う以下の少し機能があります。
listFiles <- dir(pattern = "myScript*.r")
checkScriptDependencies <- function(fname){
require(mvbutils)
rawCode <- readLines(fname)
toParse <- paste("localFunc <- function(){", paste(rawCode, sep = "\n", collapse = "\n"), "}", sep = "\n", collapse = "")
newFunc <- eval(parse(text = toParse))
ix <- match("data.table",search())
vecPrune <- c("localFunc", ls("package:data.table"))
tmpRes <- foodweb(where = c(environment(),ix), prune = vecPrune, plotting = FALSE)
tmpMat <- tmpRes$funmat
tmpVec <- tmpMat["localFunc",]
return(tmpVec)
}
listDeps <- list()
for(selFile in listFiles){
listDeps[[selFile]] <- checkScriptDependencies(selFile)
}
は今、私はちょうどlistDeps
を見る必要がある、と私は上記depMatから持っている素晴らしい小さな洞察の同じ種類を持っています。私はcheckScriptDependencies
を、他のコードから変更して、codetools::checkUsage
によって解析されるスクリプトを送信しました。スタンドアロンコードを分析するために、このような小さな機能を持つのは良いことです。声明をfoodweb
に改善した洞察のために@Spacedmanとにenvironment()
を使用してください。
(本当のhungaRiansは私が名前と型の順序に矛盾していることに気づくでしょう - tooBad :)これ以上の理由はありますが、これは私が使用しているコードとまったく同じではありません。)
私は私のコードのためにfoodweb
によって生成グラフの写真を掲載していませんでしたが、あなたはhttp://web.archive.org/web/20120413190726/http://www.sigmafield.org/2010/09/21/r-function-of-the-day-foodwebでいくつかの素晴らしい例を見ることができます。私の場合、その出力はkey
とas.data.table
のような標準的な名前付き関数とともに、:=
とJ
のdata.tableの使用を確実にキャプチャします。それは私のテキスト検索を取り除くようであり、いくつかの点で改善されています(例えば見落としていた機能を見つける)。
すべてfoodweb
は優れたツールです。mvbutils
パッケージと、マークブレービングトンの他の素敵なパッケージ(debug
など)をお試しください。 mvbutils
をインストールする場合は、進化するRコードの管理に苦労していると思われる場合は、?changed.funs
をチェックしてください。 :)
'mvbutils'パッケージで' foodweb'を試してみませんか?私はそれ自身で経験がありませんが、それは私には有望なようです(私はそれがどれだけ深く検索しているかは分かりません)。 'foodweb(where = 'package:data.table'、prune = 'function_youre_examining')のようなもの? –
@ mathematical.coffeeそれは非常に興味深いです。それは非常に有用なインパッケージと思われる。私はパッケージ間で何ができるのかはっきりしていませんが、私はそれに渦を立てます。ありがとう! – Iterator
@ mathematical.coffeeこれは非常に興味深いです。私はそれをもう少し遠ざけています。あなたは答えとしてコメントを投稿できますか?私は、それを動作させることができると仮定して、それをソリューションに編集する手助けをするかもしれません。以前はパッケージ全体で動作していないようですが、それは正しくありません。 'where'引数は検索スペースを管理するためのトリックをするようです。 Btw、changed.funsのヘルプは、私の最近の経験のいくつかを書いているように、ほぼ読んでいます。 :) – Iterator