如何确保每次更改文件时fileInput都需要操作按钮输入,而不是一次

时间:2017-03-10 20:34:20

标签: r shiny

我试着写一个闪亮的小应用程序,这是我的第一个,所以我不是编程方面的专家。我想上传一个带有fileInput函数的文件。我第一次点击浏览并选择一个文件,我必须按照预期在执行之前点击运行!但是当我选择另一个文件时,程序会自动执行,我不必再次点击运行按钮。我尝试了很多,但我不知道如何解决这个问题,也许这很明显,但我无法看到它。再次点击运行对我来说是必不可少的,因为我使用的功能是巨大的。我在这段代码中用简单的函数简化了它,但我的问题是相同的:数据可以是任何数据帧保存为csv,“。”作为十进制,例如fr<-write.csv(data.frame(name=c(1:5),value=c(1:5)),**file**)

    myfunction <- function(Data=matrix(c(2, 4, 3, 1, 5, 7), nrow=3, ncol=2) ){
  if(all(Data==matrix(c(2, 4, 3, 1, 5, 7), nrow=3, ncol=2))==TRUE) return(list(name=data.frame(Notice=c("Hello, please load data")),name=data.frame(Notice=c("Hello, please load data")),name=data.frame(Notice=c("Hello, please load data"))))

  result=list(Data,Data,Data)
  return(result)
  }

ui <- fluidPage(
  tags$head(tags$style(
    HTML('
         #sidebar {
         background-color: #C3C2F3;

         }

         body, label, input, button, select { 
         font-family: "Arial";
         }')
  )),
  titlePanel("Hello"),
  sidebarLayout(
    sidebarPanel(id="sidebar",
                 br(),
                 fileInput('file1', 'Choose CSV File',
                           accept=c('text/csv', 
                                    'text/comma-separated-values,text/plain', 
                                    '.csv')),
                 tags$hr(),
                 radioButtons('sep', 'Separator',
                              c(Comma=',',
                                Semicolon=';',
                                Tab='\t'),
                              ','),
                 selectInput("dataset", "Choose result:", 
                             choices = c("all matches in interval", "closest matches in interval","no matches")),
                 helpText("Note: save data with .csv"),
                 downloadButton('downloadData', 'Download'),
                 actionButton("go","run",class = "btn-primary")

    ),
    mainPanel(
      DT::dataTableOutput('mytable2')
    )
  )
    )



server <- function(input, output) {
  library(DT)
  library(magrittr)

  getData <- reactive({

    inFile <- input$file1

    if (is.null(input$file1))
      return(NULL)

    read.csv(inFile$datapath, sep=input$sep,dec=".")


  })

  observeEvent(input$go,{
    result <- reactive({myfunction(getData())})


    datasetInput <- reactive({

      switch(input$dataset,
             "all matches in interval" = result()[[1]],
             "closest matches in interval" = result()[[2]],
             "no matches" = result()[[3]])

    })

    output$mytable2 <- DT::renderDataTable({
      (DT::datatable(datasetInput(),rownames=FALSE) 
       %>% formatRound(c(1,2,3),digits=4))
    })


    output$downloadData <- downloadHandler(

      filename = function() { 
        paste(input$dataset,".csv", sep="")
      },

      content = function(file) {

        write.csv(datasetInput(), file)

      })})

}

shinyApp(ui, server)

有人知道我是如何管理它的,再次使用浏览后再用另一个文件,我必须再次点击运行bevore执行吗?

非常感谢!!!

1 个答案:

答案 0 :(得分:1)

您可以使用isolate来避免输入更改时的刷新,并在按下actionButton时执行它,就像在这个小例子中一样:

library(shiny)
shinyApp(ui=fluidPage(textInput("NeedSubmit","NeedSubmit", value="a"), 
                      textInput("DontNeedSubmit","DontNeedSubmit", value="b"), 
                      actionButton("Submit","Submit"), 
                      textOutput("result")),
         server=function(input, output){
           observeEvent(input$Submit, {
                        output$result <- renderText(
                             paste(input$DontNeedSubmit, 
                                   isolate(input$NeedSubmit)))
                        })
         })
)