【问题标题】:How to store reactive outputs values in a vector to be used in a function?如何将反应输出值存储在要在函数中使用的向量中?
【发布时间】:2017-06-03 15:06:37
【问题描述】:

这是问题的延伸

How to isolate the output of a reactive (function) and save to a data.frame?

基本上,我想基于具有预定值和附加值的向量构造一个表。我想将原始向量和包含该向量前 4 个值的滚动平均值的列显示为表输出。例如,如果用户添加值 200,我将拥有

d <- c(rep(100,4),200) 

并使用 zoo::rollapply() 我得到了前 4 个 d 值的滚动平均值

md <- rollapply(d , mean , fill = NA, width = list(-1:-4))

预期结果

cbind(d,md)

       d  md
[1,] 100  NA
[2,] 100  NA
[3,] 100  NA
[4,] 100  NA
[5,] 200 100

在我闪亮的应用程序中,我无法使用我的功能,当我添加值时应用程序关闭。但是,如果我使用其他功能,例如 input$c1 + 5,它就可以工作。我认为问题在于我不知道如何捕获更新的向量并使用它来运行需要向量作为输入的函数。此外,要运行应用程序,我需要匹配新列中相同数量的行。

这是我的用户界面代码:

library(shiny)

fluidPage(
  sidebarPanel(textInput("c1","example"),

           actionButton("update", "Update Table")
  ),

 mainPanel(tableOutput("example")

 )
)

和服务器

library(shiny)
library(zoo)

function(input, output) {

  #Example
  d <- c(rep(100,4))
  m <- c(rep(100,4))

  md <- reactive(
 rollapply(values$df , mean , fill=NA , width=list(-1:-4))
 )

  values <- reactiveValues(df = data.frame('D' = d, 'M_D'= m))
  newEntry <- observe({
    if(input$update > 0) {
        values$df <- isolate(rbind(values$df,data.frame('D' =input$c1, 
   'M_D' = md())))
    }
  })

  output$example <- renderTable({values$df})

} 

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    所以我会说使用了太多不同的闪亮机制,他们互相绊倒。我做了以下更改:

    • observe 更改为observeEvent,以便将计算限制在您按下update 按钮时。
    • 取消了 isolate 的用法,因为在 observeEvent 中不需要它,而不是在 observe 中。
    • 摆脱了响应式md() 函数,因为您已经将这些数据存储在reactiveValues 列表中。
    • 使rollingapply 仅对相关列而不是整个数据框进行操作。
    • 稍微清理了语法——去掉了多余的引号、c() in c(rep(...)) 等。
    • 稍微压缩一下。
    • as.numeric 添加到input$c1 处理中,否则会导致该列转换为因子并更改其值。

    代码如下:

    library(shiny)
    library(zoo)
    
    u <- fluidPage(
      sidebarPanel(textInput("c1","example"),
                   actionButton("update", "Update Table")
      ),
      mainPanel(tableOutput("example")
      )
    )
    s <- function(input, output) {
    
      #Example
      d <- rep(100,4)
      m <- rep(100,4)
    
      values <- reactiveValues(df = data.frame(D=d, M_D=m))
    
      newEntry <- observeEvent(input$update,{
        d_new <- c(values$df$D,as.numeric(input$c1))
        m_d_new <- rollapply(d_new, mean , fill=NA , width=list(-1:-4))
        values$df <- data.frame(D=d_new,M_D=m_d_new)
      })
      output$example <- renderTable({values$df})
    } 
    shinyApp(u,s)
    

    输入200 并按几次Update Table 后会产生以下结果:

    【讨论】:

    • 谢谢 Mike,这正是我所需要的。我对如何在这种情况下使用响应和观察函数感到困惑,我不知道如何调用数据框的列 (values$df$D)。这是我的第一个应用程序。
    • 您的第一个 Shiny 应用程序已经走得很远了。这种编程(反应式)与您通常看到的非常不同。当你达到 15 分时,我会请你考虑在这里投赞成票。
    • 当然,现在我没有足够的积分来投票。但我肯定会这样做。我已经编辑了我的原始帖子。请帮帮我。
    • 请在这些情况下提出一个新问题。否则事情会变得太混乱。也让您有机会获得更多积分。
    • 好的,抱歉。我不知道它是如何工作的。我也是stackoverflow的新手。我会这样做的。
    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 2019-12-28
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多