为啥“<<-”会与 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 &lt;- data.frame(problematicVariable$bar, problematicVariable$foo))。绝对没有问题。所以我想,这很奇怪...... 我摆脱了双重&lt;&lt; 并将其更改为problematicVariable &lt;- ...,现在它可以工作了。 因此,使用&lt;&lt;- 分配problematicVariable 以某种方式使problematicVariableif...else 中不可用。

为什么会导致&lt;&lt;- 出现这样的行为?这与范围混淆了?!

【问题讨论】:

这不是 C,正确定义一个函数及其输入和输出。如果问题仍然存在,请提供一个可重现的小示例。 【参考方案1】:

&lt;&lt;- 并不总是在全局环境中创建变量。但是,它将在父范围内创建变量。有时父作用域与全局环境相同。

?assign 是你想要的。但我看不出有任何理由从函数内部创建全局变量。只需返回变量 - 以这种方式更容易调试代码,并且您会得到更少的意外结果。

编辑:怀疑这是一个骗局。关于这个的很好的讨论可以找到here.

【讨论】:

不完全是骗人的,因为 Shiny 应用程序发生了崩溃(没有明确定义,但仍然存在)。

以上是关于为啥“<<-”会与 Shiny 中的函数范围混淆的主要内容,如果未能解决你的问题,请参考以下文章

为啥 ch341-uart 会与 ttyUSB 断开连接?

为啥我无法在 R Shiny 上绘制图表?

为啥 jQuery UI 的日期选择器会与动态 DOM 发生冲突?

为啥转换后的 UIView 会与层次结构中较高的其他视图重叠?

为啥表单标签会与我的 ngModel 和属性绑定混淆? ngModel 在 ngFor 里面 Form 标签

为啥 `R` 管道运算符 `|>` 在使用 Shiny 的反应式编程中不起作用?