2017-02-15 71 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) 
相关问题