在shindydashboard主体中隐藏按钮,直到呈现表格

时间:2019-04-06 07:50:39

标签: r shiny shinydashboard shinyjs

我有一个闪亮的应用程序,我在其中加载文件并渲染了tabla,我想在正文中隐藏一个按钮,直到渲染表格。该按钮将过滤器保存在文件中。我使用shinySaveButton中的shinyFiles是因为我希望用户导航到一个文件夹并选择一个自定义文件名

这是用户界面

header <- dashboardHeader()

sidebar <- dashboardSidebar(
sidebarUserPanel("Test"),
sidebarMenu(
  id = "tabs",
  menuItem("Archivo variantes", tabName = "fileupload", icon = icon("table")),
  conditionalPanel("input.tabs == 'fileupload' ",
  shinyFilesButton("file", "Choose a file" , multiple = FALSE,
               title = "Please select a file:",
               buttonType = "default", class = NULL)#,
  )
 )
)

body <- dashboardBody(
  tags$style(type="text/css",
   ".shiny-output-error { visibility: hidden; }",
   ".shiny-output-error:before { visibility: hidden; }"),

  shinyjs::useShinyjs(),

  tabItems(
    tabItem(tabName = "fileupload",
        fluidRow(column(12,
          div(DT::dataTableOutput('tabla') %>% withSpinner(color="#0dc5c1"),  style = 'overflow-x: auto'))),
        fluidRow(column(2, offset = 0,
         shinySaveButton('save', 'Save filters', 'Save as...') )))

 )
)

ui <- dashboardPage(header, sidebar, body)

这是服务器

## Server side
server = function(input, output, session) {
  options(shiny.maxRequestSize=100*1024^2)

  if (!exists("default_search_columns")) default_search_columns <- NULL

  volumes = getVolumes()
  volumes <- c(Home = fs::path_home(), "R Installation" = R.home(), getVolumes()())

   file_selected <- reactive({
     shinyFileChoose(input, "file", roots = volumes, session = session)
     if (is.null(input$file))
       return(NULL) 
     print(parseFilePaths(volumes, input$file)$datapath)
     return(parseFilePaths(volumes, input$file)$datapath)
   })   

   contents <- reactive({
     if (is.null(file_selected()))
      return()
     print(file_selected())
     df <- read.delim(file_selected(), header = TRUE, stringsAsFactors=FALSE, as.is=TRUE)
     return(tidyr::separate_rows(df, Gene.refGene, sep = ";"))
   })

# Reactive function creating the DT output object
 output$tabla <- DT::renderDataTable({        
   if(is.null(contents()))
     return()
   datos <- contents()

   DT::datatable(datos, 
    rownames = FALSE,
            style = 'bootstrap', 
            class = 'compact cell-border stripe hover', 
            filter = list(position = 'top', clear = FALSE), 
            escape = FALSE,
            extensions = c('Buttons', "FixedHeader", "Scroller"),
             options = list(
              stateSave = FALSE,
              autoWidth = TRUE,
              search = list(regex = TRUE, caseInsensitive = TRUE),
              initComplete = JS(
                  "function(settings, json) {",
                  "$(this.api().table().header()).css({'font-size': '12px'});",
                  "}"),
              scroller = TRUE,
              scrollX = TRUE,
              scrollY = "600px",
              deferRender=TRUE,
              buttons = list('colvis', list(
                    extend = 'collection',
                    buttons = list(list(extend='csv',
                                        filename = 'results'),
                                   list(extend='excel',
                                        filename = 'results')),
                    text = 'Download'
                    )),
              FixedHeader = TRUE
            ), 
            callback = JS('table.page(3).draw(false); "setTimeout(function() { table.draw(true); }, 300);"')) %>% formatStyle(columns = colnames(.$x$data), `font-size` = "12px")

})


filtros <- eventReactive(input$tabla_search_columns, {
  str(input$tabla_search_columns)
  return(input$tabla_search_columns)
})

observeEvent(input$save, 
{
observe(
    if(is.null(input$tabla)) {
      shinyjs::disable("save")
    } else { shinyjs::enable("save") }
  )
})

observe({ 
  volumes <- getVolumes()
  volumes <- c(Home = fs::path_home(), "R Installation" = R.home(), getVolumes()())
  shinyFileSave(input, "save", roots=volumes, session=session) 
  fileinfo <- parseSavePath(volumes, input$save) 
  if (nrow(fileinfo) > 0) { 
    write.table(filtros(), fileinfo$datapath, row.names = FALSE, col.names=FALSE, quote=TRUE, sep="\t") 
  }  
})

}      ShinyApp(用户界面,服务器)

我正在尝试使用shinyjs::disableshinyjs::enable,但我无法使其正常工作,选择文件之前显示了按钮save filters。而且我想一直被隐藏直到表格被渲染

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

Shiny在呈现输出时触发JavaScript事件shiny:value。因此,您可以在应用程序初始化时禁用该按钮,并借助此JS事件,可以在呈现表时启用该按钮。这是一个最小的示例:

library(shiny)
library(shinyFiles)

js <- paste(
  "$(document).ready(function(){",
  "  $('#save').prop('disabled', true);", # disable the 'save' button
  "});",
  "$(document).on('shiny:value', function(e){",
  "  if(e.name === 'table'){", # if 'table' is rendered
  "    $('#save').prop('disabled', false);", # then enable the 'save' button
  "  }",
  "});"
  , sep = "\n"
)

ui <- fluidPage(
  tags$head(tags$script(HTML(js))),
  shinySaveButton("save", "Save", "Save file"), 
  actionButton("go", "Render table"), 
  tableOutput("table")
)

server <- function(input, output){
  output[["table"]] <- renderTable({
    req(input[["go"]]>0)
    iris[1:4, ]
  })
}

shinyApp(ui, server)

enter image description here