Janko Thyson
2014-Nov-14 23:51 UTC
[R] Lexical scoping/calling stack issue: R fails to recognize an argument's default value
Dear list, I just encountered a behavior that I've never seen before: Is it possible, that certain argument names (lazy in my case) are special/reserved and thus would lead to unexpected behavior when a calling stack is involved that spreads across functions of three different packages: optionr::setAnywhereOptions() calls nestr::setNested() calls reactr::setShinyReactive()? Or is there something I'm generally missing with respect the combination of lexical scoping/the frame stack, S4 and default values of function arguments. Running the following code leads to a situation where the default value of `lazy` in `reactr::setShinyReactive()` is not properly recognized while others (e.g. `push`) are recognized just fine: require("devtools") devtools::install_github("Rappster/conditionr") devtools::install_github("Rappster/nestr") devtools::install_github("Rappster/optionr") require("optionr") container <- initializeOptionContainer(overwrite = TRUE) expect_true(setAnywhereOption(id = "x_1", value = TRUE, reactive = TRUE)) expect_equal(getAnywhereOption(id = "x_1"), TRUE) expect_true(res <- setAnywhereOption(id = "x_2", value = reactr::reactiveExpression( !getAnywhereOption(id = "x_1") ), reactive = TRUE)) The current version of `setShinyReactive()` contains a debugging section that prints these status messages (the actual code: https://github.com/Rappster/reactr/blob/bug-28/R/setShinyReactive.r#L196) 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 It also contains my current workaround: also include an argument with name `is_lazy` (whose default) value is recognized again) and then run `lazy <- is_lazy`. You can also find this information in this Stackoverflow post: http://stackoverflow.com/questions/26940474/lexical-scoping-issue-r-fails-to-recognize-an-arguments-default-value Thanks a lot for everyone that can shed some light on this! Best regards, Janko [[alternative HTML version deleted]]
Jeff Newmiller
2014-Nov-15 01:01 UTC
[R] Lexical scoping/calling stack issue: R fails to recognize an argument's default value
While you appear to have been thorough in providing access to your code, I don't think I will install a bunch of your dev code to debug it for you. The Posting Guide does say your example should be minimal, and IMO this doesn't fit that description. You should extract enough generic functions to replicate the structure of the call tree in a single short example. I suppose there could be a bug in the parameter handling, but are you sure every calling point is including the "..." argument that should be? My second blind point is that visibility of package variables does follow a complicated path, but there are good descriptions available, such as [1] or [2]. If you do think you have found a bug, the R Core team will want a minimal reproducible example, and you should read the Posting Guide on bug reporting to make sure your issue gets addressed. [1] http://obeautifulcode.com/R/How-R-Searches-And-Finds-Stuff/ [2] http://adv-r.had.co.nz/Environments.html --------------------------------------------------------------------------- Jeff Newmiller The ..... ..... Go Live... DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go... Live: OO#.. Dead: OO#.. Playing Research Engineer (Solar/Batteries O.O#. #.O#. with /Software/Embedded Controllers) .OO#. .OO#. rocks...1k --------------------------------------------------------------------------- Sent from my phone. Please excuse my brevity. On November 14, 2014 3:51:16 PM PST, Janko Thyson <janko.thyson at gmail.com> wrote:>Dear list, > >I just encountered a behavior that I've never seen before: > >Is it possible, that certain argument names (lazy in my case) are >special/reserved and thus would lead to unexpected behavior when a >calling >stack is involved that spreads across functions of three different >packages: optionr::setAnywhereOptions() calls nestr::setNested() calls >reactr::setShinyReactive()? > >Or is there something I'm generally missing with respect the >combination of >lexical scoping/the frame stack, S4 and default values of function >arguments. > >Running the following code leads to a situation where the default value >of >`lazy` in `reactr::setShinyReactive()` is not properly recognized while >others (e.g. `push`) are recognized just fine: > >require("devtools") >devtools::install_github("Rappster/conditionr") >devtools::install_github("Rappster/nestr") >devtools::install_github("Rappster/optionr") >require("optionr") > >container <- initializeOptionContainer(overwrite = TRUE) >expect_true(setAnywhereOption(id = "x_1", value = TRUE, reactive >TRUE)) >expect_equal(getAnywhereOption(id = "x_1"), TRUE) >expect_true(res <- setAnywhereOption(id = "x_2", > value = reactr::reactiveExpression( > !getAnywhereOption(id = "x_1") > ), > reactive = TRUE)) > >The current version of `setShinyReactive()` contains a debugging >section >that prints these status messages (the actual code: >https://github.com/Rappster/reactr/blob/bug-28/R/setShinyReactive.r#L196) > >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 > >It also contains my current workaround: also include an argument with >name `is_lazy` (whose default) >value is recognized again) and then run `lazy <- is_lazy`. > >You can also find this information in this Stackoverflow post: >http://stackoverflow.com/questions/26940474/lexical-scoping-issue-r-fails-to-recognize-an-arguments-default-value > >Thanks a lot for everyone that can shed some light on this! > > >Best regards, >Janko > > [[alternative HTML version deleted]] > >______________________________________________ >R-help at r-project.org mailing list >https://stat.ethz.ch/mailman/listinfo/r-help >PLEASE do read the posting guide >http://www.R-project.org/posting-guide.html >and provide commented, minimal, self-contained, reproducible code.