将服务器中生成的对象传递回ui in shiny

时间:2017-08-15 22:47:47

标签: r shiny

我需要创建一个对象(或变量(在我的服务器部分并传回ui checkboxGroupInput。我的文件有点复杂。在这里我只使用钻石数据来说明我正在尝试做什么,虽然是什么应用程序正在做无意义。我创建了一个df,一个钻石数据集的子集。我正在尝试将其传递回ui checkboxGroupInput,以便我可以选择要显示的列。我的问题是如何将df传递回ui?提前谢谢。

这是我的app.r:

library(shiny)
library(ggplot2)
library(DT)

ui <- fluidPage(
    sidebarLayout(
        sidebarPanel(
            selectInput("nrow", label = h3("number of rows"), 
                        choices = list(5, 10, 20), 
                        selected = 5),
            checkboxGroupInput("show_vars", "Columns in diamonds to show:",
                                   names(df), selected = names(df))
        ),
        mainPanel(
            DT::dataTableOutput("mytable1")
            )
        )
    )


server <- function(input, output) {

    # choose rows to display
    df = diamonds[sample(nrow(diamonds), input$nrow), ]

    output$mytable1 <- DT::renderDataTable({
        DT::datatable(df[, input$show_vars, drop = FALSE])
    })

}

shinyApp(ui, server)

错误讯息:

Warning: Error in .getReactiveEnvironment()$currentContext: Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)

1 个答案:

答案 0 :(得分:4)

您看到的具体错误是因为您尝试在此行中的任何反应上下文之外使用input$nrow(根据错误)。

 df = diamonds[sample(nrow(diamonds), input$nrow), ]

所以这需要转变为某种反应性表达

此外,您可以使用renderUIuiOutput函数在服务器内创建UI元素。这样,从服务器控制UI更容易。

library(shiny)
library(ggplot2)
library(DT)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("nrow", label = h3("number of rows"), 
                  choices = list(5, 10, 20), 
                  selected = 5),
      uiOutput(outputId = "show_vars")
    ),
    mainPanel(
      DT::dataTableOutput("mytable1")
    )
  )
)


server <- function(input, output) {

  # choose rows to display
  df <- reactive({
    diamonds[sample(nrow(diamonds), input$nrow), ]
  })

  output$show_vars <- renderUI({
    checkboxGroupInput("show_vars", "Columns in diamonds to show:",
                       names(df()), selected = names(df()))
  })


  output$mytable1 <- DT::renderDataTable({
    DT::datatable(diamonds[, input$show_vars, drop = FALSE])
  })

}

shinyApp(ui, server)