【问题标题】:How to assign reactiveValues() Shiny如何分配 reactiveValues() Shiny
【发布时间】:2015-09-28 11:10:11
【问题描述】:

我想在我闪亮的应用程序中使用reactiveValues(),但我不知道该怎么做。

我有一个actionButton,根据actionButton 的状态,我想将data.frame 分配给一些reactiveValues,然后由一些observers 处理。

我的写法是这样的

server.R

myDataFrame <- reactiveValues()

observeEvent(input$myButton, {
    myDataFrame$forProcessing <- some.data.frame
})

observe({
    #do something with myDataFrame$forProcecessing
})

但是,这会崩溃。我猜是因为myDataFrame 被创建为某种“空”,然后导致我的observe() #do something... 崩溃?!

如何正确创建reactiveValues,以便它仅在填充时触发observer()

【问题讨论】:

    标签: r shiny reactive-programming


    【解决方案1】:

    您必须使用已经存在的内容创建反应值。解决方案是在响应值中放置一个空数据框,并在观察中确保当 data.frame 为空时不会发生任何事情。所以:

    myDataFrame <- reactiveValues(forProcessing = data.frame())
    

    和:

    observe({
        if (nrow(myDataFrame$forProcessing) != 0) {
            #do something with myDataFrame$forProcecessing 
        }
    })
    

    【讨论】:

    • 哦,真的吗?我这样做(用NULL 创建df),但由于我对myDataFrame$forProcessing 有很多依赖,所以总是调用if else 在每个观察者的开头检查NULL 似乎有点笨拙。 .
    • 问题是 Shiny 需要确定会有什么样的反应。所以在飞行中添加东西是行不通的。要限制 Shiny 脚本中的 if 语句,您可以使您的函数对空数据输入具有鲁棒性,即它们可以处理 data = data.frame()
    • 关于hackiness,我还没有看到你的应用程序的结构,所以很难评论这是否是一个次优的解决方案。
    • 目前我正在这样做myDataFrame &lt;- reactiveValues(forProcessing = NULL) 然后if (is.null(myDataFrame$forProcessing)) {。那应该具有相同的功能,对吗?关于hackiness:我正在处理许多不同的dataframes的创建,这将根据ui.R进行处理,输出存储在不同的reactiveValues中并一次又一次地处理。既然我,可以说,用七个observers 来做这件事,我认为可能有一种方法可以将reactiveValues 包装成只有在filled 带有数据时才会触发的东西。
    • 这和我做的差不多。我不知道这样的功能,包括is.null() 语句对我来说似乎并没有太大的开销。您可以通过使您对data.frame 执行的操作正确地与data=NULL 一起使用来摆脱这些语句,但这可能比使用is.null 语句的简单代码要多得多,而且要困难得多。
    猜你喜欢
    • 2020-07-02
    • 1970-01-01
    • 2020-07-07
    • 2021-11-14
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 2015-12-15
    相关资源
    最近更新 更多