这是我在 R 中遇到过的最奇怪的事情。
是否有可能,某些参数名称(lazy
在我的情况下)是特殊的/保留的,因此当涉及跨三个不同包的函数的调用堆栈时会导致意外行为: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
而其他函数(例如 of push
)似乎被识别得很好。
更准确地说,如果没有我的解决方法(见下文),R 在到达此代码部分时会抱怨。但是,如您所见,默认值已定义,如果该函数被单独调用或从内部调用,它也可以正常工作nestr::setNested()
。
解决方法
当我将参数名称从更改lazy
为is_lazy
(或仅包括is_lazy
然后lazy <- is_lazy
在正文中运行)时,一切正常(请参阅上面的调试输出)。
请参阅中的调试部分reactr::setShinyReactive()
疯狂猜测这里发生了什么
我首先想到的是,这一定与词法作用域机制有关,因为“简单函数调用堆栈”不会出现这种行为。
第二个猜测是,也许S4机制在这里也造成了一些麻烦。也许也与这个问题有关?