0

これは、私が R で遭遇した中で最も奇妙なものです。

特定の引数名 (lazy私の場合) は特別/予約されているため、3 つの異なるパッケージの関数にまたがる呼び出しスタックが関係している場合に予期しない動作につながる可能性はありoptionr::setAnywhereOptions()ますnestr::setNested()reactr::setShinyReactive()?

次の例/状況を検討してください (このGitHub の問題にも記載されています) 。

パッケージ内のこの単体テストから適応optionr

require("devtools")
devtools::install_github("Rappster/conditionr")
devtools::install_github("Rappster/typr")
devtools::install_github("Rappster/nestr")
devtools::install_github("Rappster/reactr", ref = "bug-28")

devtools::install_github("Rappster/optionr")
require("optionr")

path <- file.path(tempdir(), "test")
create(path, description = getOption("devtools.desc"), check = FALSE,
  rstudio = TRUE)
setwd(path)

container <- initializeOptionContainer(overwrite = TRUE)  
setAnywhereOption(id = "x_1", value = TRUE, reactive = TRUE)
getAnywhereOption(id = "x_1")
setAnywhereOption(id = "x_2", 
  value = reactr::reactiveExpression(
    !getAnywhereOption(id = "x_1")
  ), 
  reactive = TRUE
)

getAnywhereOption(id = "x_1")
getAnywhereOption(id = "x_2")

デバッグ用に含めたステータス メッセージに注意してください。

DEBUG/push/before
[1] FALSE
DEBUG/lazy/before
Error in print(lazy) : argument is missing, with no default
DEBUG/is_lazy/before
[1] FALSE
DEBUG/lazy/after
[1] FALSE

なんらかの理由で、この非常に呼び出し元のスタック構造につ​​いて、関数reactr::setShinyReactive()はデフォルト値を認識しないように見えますがlazy、他のもの ( のそれなどpush) は問題なく認識されているようです。

より正確に言うと、私の回避策 (以下を参照) がなければ、R はこのコード セクションに到達すると文句を言うでしょう。ただし、ご覧のとおり、デフォルト値定義されており、関数がスタンドアロンまたは 内から呼び出された場合にも問題なく機能しますnestr::setNested()

回避策

引数名を to からlazytoに変更するとis_lazy(または、単にインクルードして本体でis_lazy実行lazy <- is_lazyすると)、すべて正常に動作します (上記のデバッグ出力を参照)。

のDEBUGセクションを参照してください。reactr::setShinyReactive()

ここで何が起こっているのかを勝手に推測する

私の頭に浮かぶ最初のことは、「単純な関数呼び出しスタック」の動作が表示されないため、これはレキシカルスコープメカニズムと関係があるに違いないということです。

2 番目の推測は、S4 メカニズムもここで何らかの問題を引き起こしている可能性があるということです。たぶん、この問題にも関連していますか?

4

1 に答える 1