如何隔离被动(函数)的输出并保存到data.frame?

时间:2017-02-02 22:42:34

标签: r shiny

这是对上一个问题的跟进:Add values to a reactive table in Shiny

也许这是一个菜鸟问题,但值得一试。这是我的第一个Shiny应用程序。

我正在制作一个Shiny应用程序,允许用户将他们输入的输入和值存储到data.frame中。这样他们就可以比较输出中的值。我已经模拟了我想要存储3列的代码:输入A和B,以及基于输入A和B的函数。

我认为我未能理解评估被动反应是我的缺点,所以我转向社区寻求帮助。如果我只是存储输入而不是反应函数'calcAB()',我可以使代码工作。一旦我包含该功能,一切都会崩溃。我收到一个错误:

Warning: Error in [<-.data.frame: replacement has 2 items, need 3

如果我删除了calcAB()函数,我可以毫无问题地保存输入。一旦我包含它,我得到上述错误。问题是如何将该反应函数的输出存储在data.frame中?

我的代码如下:

UI代码:

shinyUI(fluidPage(
# Application title
titlePanel("Test Save Data to DF"),

# Sidebar with inputs A and B
sidebarLayout(
  sidebarPanel(
     sliderInput("A",
                 "Input A",
                 min = 1,
                 max = 50,
                 value = 30),
   numericInput("B",
                "Input B",
                min = 1,
                max = 30,
                value = 10),
# Action Button to save the inputs to a data.frame
   actionButton('update', label = 'Update')
),


mainPanel(
   tableOutput('testTable')
)
)
))

服务器代码:

shinyServer(function(input, output) {

     # My reactive function
  calcAB <- reactive({
   input$A * input$B
})


values <- reactiveValues()
values$df <- data.frame('A' = numeric(0), 'B' = numeric(0),
  'AB' = numeric(0))

newEntry <- observe({
  if(input$update >0) {
newLine <- isolate(c(input$A, input$B, calcAB()))
isolate(values$df[nrow(values$df)+1,] <- c(input$A, input$B, calcAB()))
})

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

1 个答案:

答案 0 :(得分:1)

尝试使用此代码:

shinyServer(function(input, output) {
    calcAB <- reactive(input$A * input$B)

    values <- reactiveValues(df = data.frame('A' = numeric(0), 'B' = numeric(0), 'AB' = numeric(0)))

    newEntry <- observe({
      if(input$update >0) {
        values$df <- isolate(rbind(values$df,data.frame('A' =input$A, 'B' = input$B,'AB' = calcAB())))
      }})

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