将列添加到Shiny中的反应数据框并更新它们

时间:2017-04-07 12:47:32

标签: r dataframe shiny

我希望能够基于将一列与另一列分开来计算新的数据列,其中两个原始列都由用户输入选择。我想将这些计算数据加入原始表(或其副本)。

我已经设法弄清楚如何制作一个对列输入选择作出反应的数据帧,并且我设法进行了将一列除以另一列的计算,但是我无法制作最终的数据帧。包括所有原始列以及新计算的列。

这是我使用内置的Iris数据进行的模拟。它显示第一个表中所选列的数据,以及第二个表中的计算(您需要向下滚动很远才能看到这个)。

如何将此计算数据加入原始来源?

非常感谢

#Ui        
pageWithSidebar(
      headerPanel('Calculate Column'),
      sidebarPanel(

        #select variables from iris dataset
        selectInput('xcol', 'X Variable', names(iris)),
        selectInput('ycol', 'Y Variable', names(iris),
                    selected=names(iris)[[2]])
      ),
      mainPanel(
        #display the selected variables
            tableOutput("view"),
         #display the calculated variable
            tableOutput("view2")
      )
    )


#Server
        function(input, output, session) {

      # Combine the selected input variables into a new data frame
      selectedData <- reactive({
        iris[, c(input$xcol, input$ycol),]
      })


      # divide one variable selection by the other
      selectedData2 <- reactive({
                iris$new<-iris[, c(input$xcol)]/iris[, c(input$ycol)]

        })

      # create data output for selected variables
      output$view <- renderTable({selectedData()
      })

      # create data output for calculated variable
      output$view2 <- renderTable({selectedData2()
      })

    }

2 个答案:

答案 0 :(得分:4)

您忘了iris不是反应元素,因此您的代码无法正常工作。你有两个选择:

  • 使用reactive()创建一个反应值来存储该数据框。
  • 创建&#34;全球&#34;您可以使用reactiveValues()存储更新数据框的反应值。

使用具有reactiveValues的全局反应式表达式

使用reactiveValues,您可以列出与inputoutput非常相似的反应式表达式。在下面的示例中,我使用它将数据框iris存储为globals$mydf。然后,您可以使用例如observe来反应更改值,如以下服务器函数所示:

#Server
server <- function(input, output, session) {

  globals <- reactiveValues(
    mydf = iris
  )

  observe({
    thedf <- globals$mydf
    newvar <- thedf[[input$xcol]] / thedf[[input$ycol]]
    globals$mydf$ratio <- newvar
  })


  # create data output for selected variables
  output$view <- renderTable({
    globals$mydf
  })
}

使用reactive()

你可以制作两个相互依赖的反应式表达式:

  • 选择变量并计算该比率的人
  • 将此结果与所选变量结合起来的

您的服务器将如下所示:

server <- function(input, output, session) {

  newdf <- reactive({
    cbind(
      iris[c(input$xcol, input$ycol)],
      Ratio = newvar()
    )
  })

  newvar <- reactive({
    iris[[input$xcol]] / iris[[input$ycol]]
  })

  # create data output for selected variables
  output$view <- renderTable({
    newdf()
  })

}

虽然您认为这不是您正在寻找的内容,但您可以在其他代码中使用newdf(),就像在上一个示例中使用globals$mydf一样。 reactiveValues()如果您的代码的不同部分必须能够更改数据框,则会获得回报。

答案 1 :(得分:0)

reactive selectedData2你只是做一个增量<-,你不会返回任何内容,我认为你应该这样做:

   function(input, output, session) {

  # Combine the selected input variables into a new data frame
  selectedData <- reactive({
    return(iris[, c(input$xcol, input$ycol),])
  })


  # divide one variable selection by the other
  selectedData2 <- reactive({
            new<-iris[, c(input$xcol)]/iris[, c(input$ycol)]
            return(new)

    })

  # create data output for selected variables
  output$view <- renderTable({selectedData()
  })

  # create data output for calculated variable
  output$view2 <- renderTable({selectedData2()
  })

}