为啥“<<-”会与 Shiny 中的函数范围混淆
Posted
技术标签:
【中文标题】为啥“<<-”会与 Shiny 中的函数范围混淆【英文标题】:Why does "<<-" messes with the scope of a function in Shiny为什么“<<-”会与 Shiny 中的函数范围混淆 【发布时间】:2017-07-15 05:29:05 【问题描述】:我遇到了一个非常有趣的问题。我写了一个函数,想检查函数内一些变量的输出以及返回结果。
observe(
result <- myFunction()
)
myFunction <- function()
# some calculations
# ...
# create Dataframe from previous calculated variables
# I was interested in the result of problematicVariable
# thats why I wanted to make it global for checking, after
# closing down the shiny app
problematicVariable <<- data.frame(...)
if(someCondition)
# ...
else
# some calculations
# ...
# now I used problematicVariable for the first time
foo <- data.frame(problematicVariable$bar, problematicVariable$foo)
这给了我
data.frame:参数暗示不同的行数:...
但是,由于我将problematicVariable
设为全局,因此我运行了应用程序手动崩溃的行 (foo <- data.frame(problematicVariable$bar, problematicVariable$foo)
)。绝对没有问题。所以我想,这很奇怪......
我摆脱了双重<<
并将其更改为problematicVariable <- ...
,现在它可以工作了。
因此,使用<<-
分配problematicVariable
以某种方式使problematicVariable
在if...else
中不可用。
为什么会导致<<-
出现这样的行为?这与范围混淆了?!
【问题讨论】:
这不是 C,正确定义一个函数及其输入和输出。如果问题仍然存在,请提供一个可重现的小示例。 【参考方案1】:<<-
并不总是在全局环境中创建变量。但是,它将在父范围内创建变量。有时父作用域与全局环境相同。
?assign
是你想要的。但我看不出有任何理由从函数内部创建全局变量。只需返回变量 - 以这种方式更容易调试代码,并且您会得到更少的意外结果。
编辑:怀疑这是一个骗局。关于这个的很好的讨论可以找到here.
【讨论】:
不完全是骗人的,因为 Shiny 应用程序发生了崩溃(没有明确定义,但仍然存在)。以上是关于为啥“<<-”会与 Shiny 中的函数范围混淆的主要内容,如果未能解决你的问题,请参考以下文章
为啥 jQuery UI 的日期选择器会与动态 DOM 发生冲突?
为啥转换后的 UIView 会与层次结构中较高的其他视图重叠?