2017-08-15 45 views
1

我需要創建一個對象(或變量(在我的服務器部分並返回到ui checkboxGroupInput中)我的文件有點複雜,在這裏我只是使用鑽石數據來說明我正在嘗試這樣做,儘管該應用的做法沒有意義,我創建了一個df,一個鑽石數據集的子集,我試圖將其傳回到ubox checkboxGroupInput,以便我可以選擇要顯示的列。我的問題是我如何通過DF回UI在此先感謝在服務器生成的pass對象返回到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.) 

回答

3

您所看到的具體錯誤是因爲您嘗試在此行的任何被動上下文(根據錯誤)之外使用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) 
+0

非常感謝你!爲什麼你需要名稱(df())?不是名稱(df)? – zesla

+0

@zesla - 因爲'df'現在是'reactive'函數,所以要訪問它,你需要使用'df()' – SymbolixAU