27

欠落しているRパッケージをチェックし、必要に応じてそれらをインストールするための一連の関数をコーディングしようとしています。StackOverflowでそれを行うためのいくつかの良いコードがあります:ここから始めてください

特にRは成功したメッセージでさえ赤インクで返すので、関数をできるだけ静かにしたいと思います。quietly = TRUEしたがって、私は引数をとの両方libraryに渡そうとしましたrequire

ただし、これらのオプションは機能しないようです。

# attempt to get a silent fail
require(xyz, quietly = TRUE)
Warning message:
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  :
  there is no package called ‘xyz’

どうすればrequire黙って失敗することができますか、そして私はquietlyオプションについて何を得ていませんか?

ドキュメントには次のように書かれています。

quietly論理的です。TRUEの場合、パッケージのロードを確認するメッセージは出力されません。ほとんどの場合、パッケージのロードが失敗してもエラー/警告は出力されません。

しかし、私の個人的な経験では、「ほとんどの場合」は「ほとんどない」はずです。それについてのあなたの経験について喜んで聞きます。理論的根拠:学生を支援するためのコーディング関数。


追加。quiet = TRUE同じ質問がに当てはまりますinstall.packages()。プログレスバーのみが削除され、中央値のユーザーには使用されない場合でも、続く「ダウンロードされたバイナリパッケージが含まれています」というメッセージ(黒で印刷されています)は削除されません。


追加。これが誰かに興味があるかもしれない場合に備えて、これまでのコードは次のとおりです。

## getPackage(): package loader/installer
getPackage <- function(pkg, load = TRUE, silent = FALSE, repos = "http://cran.us.r-project.org") {
  if(!suppressMessages(suppressWarnings(require(pkg, character.only = TRUE, quietly = TRUE)))) {
    try(install.packages(pkg, repos = repos), silent = TRUE)
  }
  if(load) suppressPackageStartupMessages(library(pkg, character.only = TRUE, quietly = TRUE))
  if(load & !silent) message("Loaded ", pkg)
}

## Not run:
x <- c("ggplot2", "devtools") # etc.
lapply(x, getPackage, silent = TRUE)

quietly上記の関数での使用は、期待どおりに機能しないように思われるため、やめることを考えています。コア開発チームから説明を得るために、おそらくRユーザーリストにそれについて尋ねるべきです。私のsuppressMessages(suppressWarnings(require(...)))経験では、回避策は不安定になる可能性があります。

4

6 に答える 6

23

require関数を非常に静かにしたい場合は、次を使用できます。

suppressMessages(suppressWarnings(require(xyz)))

これは:

...まあ、何も:)

于 2013-02-12T14:38:55.743 に答える
19

これがいつ言語に追加されたかは正確にはわかりませんが、最近ではこれを行うための好ましい方法は次のとおりです。

suppressPackageStartupMessages({
    require(this)
    require(that)
    ...
})

これは「読み込み中...」、シンボルのマスキングに関する苦情、およびその他のノイズを引き起こしますが、実際の問題を示すメッセージは引き続き表示されます(たとえば、パッケージまたは依存関係が利用できません)。

于 2015-10-13T16:41:05.147 に答える
8

最も簡単な解決策は次のように思われます

try(library(xyz), silent=TRUE)

require基本的にはラッパーtryCatch(library)であるため、これは無関係なコードを切り取るだけです。

于 2014-07-24T02:41:36.273 に答える
1

回避策の1つは、呼び出しの前後に警告オプションを設定することです...

 options(warn=-1)
 try(require(xyz, quietly = TRUE),silent=TRUE)
 options(warn=0)

しかし、これは危険です。必要なのは、警告メッセージの色を変更することだと思います。

于 2013-02-12T14:39:03.810 に答える
1
PkgNames <- c("forecast", "tseries", "ggplot2", "qcc", "ggmap","corrgram",
              "effects", "Hmisc", "plyr", "reshape")
invisible(suppressMessages(suppressWarnings(lapply(PkgNames, require, character.only = T))))
于 2014-07-23T19:19:16.973 に答える
0

これは古い質問ですが、答えを探している他の人のために:

requireNamespacewithquietly=TRUEは、パッケージがインストールされているかどうかを静かにチェックしているように見えるので、静かにチェックできます。

    > if (requireNamespace("Foobar", quietly = TRUE)) "Found it" else "Not found"
    [1] "Not found"
    > if (requireNamespace("utils", quietly = TRUE)) "Found it" else "Not found"
    [1] "Found it"

したがって、OPの主要な問題(太字の質問)を解決するには、次のようにします。

    if (requireNamespace("package", quietly=TRUE)) require("package", quietly=TRUE);

パッケージのロードからノイズが発生します。2番目quietly=TRUEはやや役立ちます。したがって、上記は、欠落しているパッケージについてはサイレントであり、一部の見つかったパッケージについてはサイレントであり、他のパッケージがない場合よりもノイズがはるかに少なくなりますquietly。間違いなく、まったく役に立たないパッケージがあります。

于 2021-05-23T04:08:36.287 に答える