一度に複数のパッケージをデタッチして作業した後 、次の検証コードがそのままになっている理由がbase::detach
あるのか 、それともバグがあるのか 疑問に思いますか?
(機能自体はdetach(name, pos = 2L, unload = FALSE, character.only = FALSE,
force = FALSE)
)
if (!missing(name)) {
if (!character.only)
name <- substitute(name)
pos <- if (is.numeric(name))
name
else {
if (!is.character(name))
name <- deparse(name)
match(name, search())
}
if (is.na(pos))
stop("invalid 'name' argument")
「character.only」引数が設定されているかどうかに関係なく、値is.character(name)
を実行する危険を冒す前にテストする方がよいようです。ドキュメントには、 が文字列の場合に設定する必要があると明示的には記載されていません。
では、バグ/機能強化のリクエストを送信する前に、検証がそのままである確固たる理由はありますか?substitute()
name
character.only=TRUE
name
編集: mnel の応答についてコメントするには、ここに私のテスト例を示します。
Rgames> detlist<-c('Hmisc','survival','splines')
Rgames> library(Hmisc)
Rgames> debug(base::detach)
Rgames> base::detach(detlist[1])
# skipped the startup stuff.
Browse[2]>
debug: if (!character.only) name <- substitute(name)
Browse[2]> name
[1] "Hmisc"
Browse[2]>
debug: name <- substitute(name)
Browse[2]>
debug: pos <- if (is.numeric(name)) name else {
if (!is.character(name))
name <- deparse(name)
match(name, search())
}
Browse[2]> name
detlist[1]
Browse[2]>
debug: if (!is.character(name)) name <- deparse(name)
Browse[2]>
debug: name <- deparse(name)
Browse[2]> deparse(name)
[1] "detlist[1]"
それで問題がわかります。私の入力変数は有効な名前ですが、設定character.only
に失敗するTRUE
と望ましくないdeparse
ことが起こり、match(name, search())
明らかな理由で失敗します。mnel が説明する状況に対処するために、内部ではあるものの、最初にチェック
した方がユーザーにとっては簡単だと思います。2 つの理由: 1) 引数さえ必要ない方が「ユーザーフレンドリー」であり、2) 現在のドキュメントでは、ユーザーがいつ引数を設定する必要があるかについて警告していません。is.character
tryCatch
detach
character.only
character.only==TRUE
name
引数は、文字列を含むオブジェクトです (ただし、単純な文字列であればそうではないと思います。 detach(package:Hmisc) または detach("package:Hmisc") のいずれかが機能しますが、私の例が示すように、への参照ではありません同じ文字列)。