2016-12-14 130 views
1

在我的应用程序中,我希望用户选择一个文件夹,并从该文件夹中选择一个文件。闪亮的条件面板

我以为使用conditionalPanel(),所以用户只会看到第一个按钮,直到他选择文件夹。我编写了这段代码,但是我收到了这个错误信息,'找不到'对象'输入',那么执行此操作的正确方法是什么?在绝对面板中放置一个条件面板是个问题吗?

library(shiny) 
library(ggplot2) 

ui <- shinyUI(fluidPage(
    titlePanel(""), 
    fluidRow(
    # select input for selecting a folder 
    column(2, absolutePanel(fixed = TRUE, width = '180px', 
         selectInput("pick_folder", label = '', selected='choose_a_folder', 
           choices = setNames(as.list(c('choose_a_folder', basename(setdiff(list.dirs(recursive = FALSE),'.')))), 
               c('choose_a_folder', basename(setdiff(list.dirs(recursive = FALSE),'.'))))))), 
    # select input for selecting a file absolutePanel then conditionalPanel 
    column(2, absolutePanel(fixed = TRUE, width = '180px', 
         conditionalPanel(condition="input.pick_folder==choose_a_folder", 
           selectInput('pick_file', label = '', selected = 'choose_a_file', 
              choices = setNames(as.list(c('choose_a_file', basename(setdiff(list.files(path=input$pick_folder ,recursive = FALSE),'.')))), 
                   c('choose a file', basename(setdiff(list.files(path=input$pick_folder ,recursive = FALSE),'.')))))))), 
), 
    fluidRow(
    #plot 
    plotOutput('my_plot') 

    ))) 

    # server 
    server <- shinyServer(function(input, output) { 
    output$my_plot <- renderPlot({ 
     dat <- read.table(file=paste(input$pick_folder, input$pick_file, sep='/')) 
     # some plots over dat 
    }) 

    }) 
    shinyApp(ui, server) 

回答

1

的probem源于试图动态创建为您的应用程序的一部分ui里面的文件选择的选择。你应该做的方式是使用uiOutputrenderUI创建ui(您的文件选择)在你的server部分动态部分

下面的代码似乎做什么你描述你想要的:

library(shiny) 
library(ggplot2) 

ui <- shinyUI(fluidPage(
    titlePanel(""), 
    fluidRow(
    # select input for selecting a folder 
    column(2, absolutePanel(fixed = TRUE, width = '180px', 
          selectInput("pick_folder", label = '', selected='choose_a_folder', 
             choices = setNames(as.list(c('choose_a_folder', basename(setdiff(list.dirs(recursive = FALSE),'.')))), 
                  c('choose_a_folder', basename(setdiff(list.dirs(recursive = FALSE),'.'))))))), 
    # select input for selecting a file absolutePanel then conditionalPanel 
    column(2, absolutePanel(fixed = TRUE, width = '180px', 
          conditionalPanel(condition="input.pick_folder==choose_a_folder", 
              # Insert a dynamic bit of UI 
              uiOutput("fileselection") 
              ) 
          ) 
      ) 
), 
    fluidRow(
    #plot 
    plotOutput('my_plot') 

))) 

# server 
server <- shinyServer(function(input, output) { 
    output$my_plot <- renderPlot({ 
    dat <- read.table(file=paste(input$pick_folder, input$pick_file, sep='/')) 
    # some plots over dat 
    }) 

    output$fileselection <- renderUI({ #Define the dynamic UI 
    selectInput('pick_file', label = '', selected = 'choose_a_file', 
       choices = setNames(as.list(c('choose_a_file', basename(setdiff(list.files(path=input$pick_folder ,recursive = FALSE),'.')))), 
            c('choose a file', basename(setdiff(list.files(path=input$pick_folder ,recursive = FALSE),'.')) 
            ) 
       ) 
    ) 
    }) 

}) 

shinyApp(ui, server) 
+0

谢谢!看来我需要尝试将大部分代码移动到服务器上,这是过去一周内第二次,这是我的问题的解决方案。 –

+1

服务器就是所有思维发生的地方,所以如果你的代码在做任何思考,它应该可能在服务器中。用户界面全都是关于外观(如此肤浅,呃!)。 –