如何在函数中使用的向量中存储无功输出值?

时间:2017-06-03 15:06:38

标签: r shiny

这是问题的扩展

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

基本上我想基于具有预定和附加值的向量构建表。我想将tableoutput显示为原始向量和一个列,该列具有此向量的前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

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

这是我的UI代码:

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})

} 

1 个答案:

答案 0 :(得分:3)

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

  • observe更改为observeEvent,以便将计算限制在您按下update按钮时。
  • 取消isolate用法,因为observeEvent不需要observe
  • 删除了被动md()函数,因为您已将该数据存储在reactiveValues列表中。
  • 使rollingapply仅在相关列而不是整个数据框上运行。
  • 稍微清理了一下语法 - 如果c()中有无关的引号,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几次后,会产生以下结果:

enter image description here