2016-12-08 1 views
3

別のパッケージの関数にアクセスするには、 pkgs::functionという表記を使用します。これは時々survivalパッケージからこのような問題を引き起こす:検索パスに接続せずに別のパッケージの関数を使用しますか?

data(logan,package="survival") 
resp <- levels(logan$occupation) 
n <- nrow(logan) 
indx <- rep(1:n, length(resp)) 
logan2 <- data.frame(logan[indx,], 
        id = indx, 
        tocc = factor(rep(resp, each=n))) 
logan2$case <- (logan2$occupation == logan2$tocc) 
survival::clogit(case ~ tocc + tocc:education + survival::strata(id), logan2) 

それがエラーを与える: Error in eval(expr, envir, enclos) : could not find function "coxph"

coxphがclogit関数から内部的に呼び出される別の関数です。この状況を避けることはできますか? Hadleyのadvanced rベストプラクティスに従って、パッケージを検索パスに追加することは望ましくありません。つまり、library(survival)を使用します。

+2

パッケージを添付しないのはなぜですか?パッケージから複数の関数を使用していて、明らかに問題を引き起こしています。 –

+0

パッケージ作成者は関数のために 'survival :: coxph'の呼び出しを1つずつ作成しました。パッケージを外部から指定するのは難しいでしょう。 –

答えて

4

(上記】増幅@ RichScrivenさんのコメント。)

私は高度なRにあなたがベストプラクティスとして「library()を使用していない」取得しているところ全くわかりません。たぶんFunctions sectionで(私は間違ったビットを持っている場合、明確にするためにあなたの質問を編集してください!)それが言うところ:ここ

The functions that are the easiest to understand and reason about are pure functions: functions that always map the same input to the same output and have no other impact on the workspace. In other words, pure functions have no side effects: they don't affect the state of the world in any way apart from the value they return.

... [points out that library() is an impure function because it changes the search path] ...

It's generally a good idea to minimise the use of side effects, and where possible, to minimise the footprint of side effects by separating pure from impure functions.

注緩い文言:「それは一般的に最小化するために...可能性は良いアイデアです、最小化する... "これは" library()を使用しないでください "という意味ではありません... library()を関数またはパッケージの中に入れたくないのは意味があります。あなたがパッケージを使用しているなら、代わりに@importFrom survival clogit coxphを使うことができますか?私はそれぞれの機能の冒頭に@importFromタグを置くことで、外国の機能を識別するためには必ず::が必要です(あなたの走行距離は異なる場合があります)。しかし

、あなたが実際に生存分析を行うには書き込みコードしているならば、library(survival)を避けるために偉大な長さに行くの後方に曲げが不要と思われます。

上記のAmplifying @ PierreLafortuneのコメントclogitにはコードcoxcall[[1]] <- as.name("coxph")が内部的に含まれています。この行がcoxcall[[1]] <- as.name("survival::coxph")に変更された場合、あなたのコードはそのまま動作するでしょう。あなたが強く感じた場合はissue request on Github about thisを投稿することができます...

+0

私は私のパッケージの1つの関数の中で生存コードを使用しています。そして、あなたの引用と、 'devtools :: use_package(" survival "、type =" Imports ")の表示のように、これらのシナリオでは' :: '表記法を用いることが好ましい。特定のパッケージへのすべての呼び出しを簡単に見つけることもできます。ありがとう – Faridcher

0

ちょうどsurvival::coxph->coxphです。ここでは、同じ名前の環境で新しい関数を作成するだけなので、clogitは新しい関数を見つけるはずです。

+0

これは動作しますが、それは私が後ろだったものではありません。とにかくありがとう – Faridcher

関連する問題