簡體   English   中英

R SHINY:根據選擇輸入/數字輸入選擇清除/更新主面板

[英]R SHINY: Clear/ update mainPanel depending on selectInput/numericInput choice

我對閃亮很陌生(玩了大約一周)。 我正在嘗試創建一個應用程序,它接受和輸入制表符分隔的文本文件並執行幾個探索性功能。 在這種情況下,我將展示該應用程序的一個非常簡化的版本,只是為了突出我在特定情況下想要做的事情:

問題:

如果您使用示例數據(或任何相同格式的數據)嘗試應用程序,您會注意到該應用程序有效地執行了默認匯總表(如果selectInput="summarize" ,則output$sumfile) ,但是當您嘗試選擇“explore”,前一個表從 mainPanel 中刪除,並輸出完整文件( selectInput="explore" ,然后output$gridfile )在它仍然選擇了selectInput="summarize"

如果您重新選擇“匯總”,則excelOutput("sumfile")會在 mainPanel 上重復。

我的目標很簡單:

excelOutput("sumfile")selectInput="summarize" ONLY 和

excelOutput("gridfile")selectInput="explore" ONLY

在 mainPanel 上沒有放置問題或重復

到目前為止,我已經嘗試過:

inFile=input$df

if(is.null(inFile))
  return(NULL)

if(input$show=="summarize") 
  return(NULL)

或者

inFile=input$df

if(is.null(inFile))
  return(NULL)

if(input$show=="explore") 
     return(NULL)

控制 mainPanel 上顯示的內容,但存在放置和重復問題。

樣本數據:

#Build test data
testdat<-data.frame(W=c(rep("A",3),
                        rep("B",3),
                        rep("C",3)),
                    X=c(letters[1:9]),
                    Y=c(11:19),
                    Z=c(letters[1:7],"",NA),
                    stringsAsFactors = FALSE)
#Export test data
write.table(testdat,
            "your/path/file.txt",
            row.names = FALSE,
            sep = "\t",
            quote = FALSE,
            na="")

閃亮的應用程序(app.R):

library(shiny)
library(excelR)

#function to summarize tables
Pivot<-function(df){
  cclass<-as.character(sapply(df,
                              class))
  df.1<-apply(df,
              2,
              function(x) unlist(list(nrows = as.numeric(NROW(x)),
                                      nrows.unique = length(unique(x))-(sum(is.na(x))+length(which(x==""))),
                                      nrows.empty = (sum(is.na(x))+length(which(x==""))))))

  df.2<-data.frame(df.1,
                   stringsAsFactors = FALSE)
  df.3<-data.frame(t(df.2),
                   stringsAsFactors = FALSE)
  df.3$col.class<-cclass
  df.3$col.name<-row.names(df.3)
  row.names(df.3)<-NULL
  df.3<-df.3[c(5,4,1,2,3)]
  return(df.3)
}

ui <- fluidPage(
  ui <- fluidPage(titlePanel(title=h1("Summary generator",
                                      align="center")),
                  sidebarLayout(
                    sidebarPanel(
                      h3("Loading panel",
                         align="center"),
                      fileInput("df", 
                                "Choose file (format: file.txt)",
                                accept = c("plain/text",
                                           ".txt")),
                      selectInput("show",
                                  "Choose what to do with file",
                                  choices=c("summarize","explore")),
                      p("**'summarize' will output a summary of the selected table"),
                      p("**'explore' will output the full selected editable table"),

                      tags$hr()

                    ),
                    mainPanel(
                      excelOutput("gridfile"),
                      excelOutput("sumfile")
                    ))))


server <- function(input, output) {
  dat<-reactive({
    fp<-input$df$datapath
    read.delim(fp, 
               quote="", 
               na.strings="\"\"", 
               stringsAsFactors=FALSE)
  })
  #get summary
  output$sumfile<-renderExcel({
    inFile=input$df

    if(is.null(inFile)) #if fileInput is empty return nothing
      return(NULL)

    if(input$show=="explore") #if selectInput = "explore" return nothing
      return(NULL)

    dat.1<-data.frame(dat())
    dat.2<-Pivot(dat.1)
    excelTable(dat.2,
               defaultColWidth = 100,
               search = TRUE)

  })
  #get full file
  output$gridfile<-renderExcel({
    inFile=input$df

    if(is.null(inFile)) #if fileInput is empty return nothing
      return(NULL)

    if(input$show=="summarize") #if selectInput = "summarize" return nothing
      return(NULL)
    dat.1<-data.frame(dat())
    excelTable(dat.1,
               defaultColWidth = 100,
               search = TRUE)

  })
}

shinyApp(ui = ui, server = server)


做你想做的一種方法是根據你對`input$show 的選擇對你的輸入input$showinput$dfrenderExcel使用observeEvent 這是您的代碼的更新版本:

library(shiny)
library(excelR)

#function to summarize tables
Pivot<-function(df){
  cclass<-as.character(sapply(df,
                              class))
  df.1<-apply(df,
              2,
              function(x) unlist(list(nrows = as.numeric(NROW(x)),
                                      nrows.unique = length(unique(x))-(sum(is.na(x))+length(which(x==""))),
                                      nrows.empty = (sum(is.na(x))+length(which(x==""))))))

  df.2<-data.frame(df.1,
                   stringsAsFactors = FALSE)
  df.3<-data.frame(t(df.2),
                   stringsAsFactors = FALSE)
  df.3$col.class<-cclass
  df.3$col.name<-row.names(df.3)
  row.names(df.3)<-NULL
  df.3<-df.3[c(5,4,1,2,3)]
  return(df.3)
}

ui <- fluidPage(
  ui <- fluidPage(titlePanel(title=h1("Summary generator",
                                      align="center")),
                  sidebarLayout(
                    sidebarPanel(
                      h3("Loading panel",
                         align="center"),
                      fileInput("df",
                                "Choose file (format: file.txt)",
                                accept = c("plain/text",
                                           ".txt")),
                      selectInput("show",
                                  "Choose what to do with file",
                                  choices=c("summarize","explore")),
                      p("**'summarize' will output a summary of the selected table"),
                      p("**'explore' will output the full selected editable table"),

                      tags$hr()

                    ),
                    mainPanel(
                      excelOutput("gridfile"),
                      excelOutput("sumfile")
                    ))))


server <- function(input, output) {
  dat<-reactive({
    fp<-input$df$datapath
    read.delim(fp,
               quote="",
               na.strings="\"\"",
               stringsAsFactors=FALSE)
  })

  observeEvent({
    input$show
    input$df
    }, {
    inFile=input$df
    if(is.null(inFile)) #if fileInput is empty return nothing
      return(NULL)

    if(input$show=="explore") {
      output$gridfile<-renderExcel({

        dat.1<-data.frame(dat())
        excelTable(dat.1,
                   defaultColWidth = 100,
                   search = TRUE)

      })
    }

    if(input$show=="summarize") {
      output$sumfile<-renderExcel({

        dat.1<-data.frame(dat())
        dat.2<-Pivot(dat.1)
        excelTable(dat.2,
                   defaultColWidth = 100,
                   search = TRUE)

      })
    }
  })

}

shinyApp(ui = ui, server = server)

希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM