2017-02-15 68 views
0

我正在創建一個R閃亮的應用程序,我希望有兩個selectInput即數據集名稱和列名稱。現在,我可以在第一個輸入中獲取數據集名稱,但我無法創建依賴列selectIput(其列表將取決於所選數據集)。請指導。如何在R中的Shiny應用程序中創建相關提示

require(shiny) 
require(MASS) 

a <- data(package = "MASS")[3] 
b <- a$results[,3] 

ui <- fluidPage(
    sidebarPanel(width = 2, 

    selectInput(inputId = "dsname",label = "Select Dataset:",choices = c(b)), 

    colnames <- names("dsname"), 

    selectInput(inputId = "columns", label = "Choose columns", 
       choices = c(colnames))     
) 
) 

server <- function(input,output) {} 

shinyApp(ui <- ui, server <- server) 

回答

0

爲了在閃亮的「有求必應」的元素,你需要用你的表情在reactive({...})計算響應元件。

您可以在ui()server()uiOutput中使用renderUI並使用類似的方法。這裏是我使用R的一些數據集(虹膜,mtcars和鑽石)建立的一個例子:

library(shinythemes) 
library(shiny) 
library(ggplot2) 

ui <- fluidPage(theme = shinytheme("superhero"), 
    titlePanel("Welcome to Responisve Shiny"), 
    sidebarLayout(
     sidebarPanel(
      selectInput("data", "Dataset:", 
         choices = c("mtcars", "iris", "diamonds") 
        ), 
     uiOutput("x_axis"), 
     uiOutput("y_axis"), 
     uiOutput("color") 
    ), 
     mainPanel(
     plotOutput("distPlot") 
    ) 
    ) 
) 
server <- function(input, output) { 
    output$x_axis <- renderUI({ 
     col_opts <- get(input$data) 
     selectInput("x_axis2", "X-Axis:", 
        choices = names(col_opts)) 
    }) 
    output$y_axis <- renderUI({ 
     cols2 <- reactive({ 
      col_opts2 <- get(input$data) 
      names(col_opts2)[!grepl(input$x_axis2, names(col_opts2))] 
     }) 
     selectInput("y_axis2", "Y-Axis:", 
        choices = cols2(), 
        selected = "hp") 
    }) 
    output$color <- renderUI({ 
     col_opts <- get(input$data) 
     selectInput("color", "Color:", 
        choices = names(col_opts), 
        selected = "cyl") 
    }) 
    output$distPlot <- renderPlot({ 
     if(input$data == "mtcars"){ 
      p <- ggplot(mtcars, aes_string(input$x_axis2, input$y_axis2, color = input$color)) + 
       geom_point() 
     } 
     if(input$data == "iris"){ 
      p <- ggplot(iris, aes_string(input$x_axis2, input$y_axis2, color = input$color)) + 
       geom_point() 
     } 
     if(input$data == "diamonds"){ 
      p <- ggplot(diamonds, aes_string(input$x_axis2, input$y_axis2, color = input$color)) + 
       geom_point() 
     } 
     print(p) 
    }) 
} 
shinyApp(ui = ui, server = server) 
相關問題