3

我正在尝试创建一个闪亮的应用程序,能够根据用户的选择选择行和列。对于选择我使用的列pickerInput和选择行,扩展名“选择”和您可以在代码中看到的更多选项(我看到这篇文章非常有效。)

问题是我收到了这个警告,我认为它与选择的类型不兼容。我担心我没有看到的东西会产生更多的错误。

警告:Select 扩展无法在服务器端处理模式下正常工作。建议仅在客户端处理模式下使用 Select 扩展(通过设置server = FALSEin DT::renderDT())或使用 DT 自己的选择实现(参见selection?DT::datatable 中的参数)。

另一方面,当我选择“行”时,我不知道如何从“pickerInput”和操作按钮中隐藏“选择输入”。

这是代码:

    library(shiny)
    library(shinyWidgets)
    library(dplyr)

ui <- fluidPage(
  
  # Application title
  titlePanel("Old Faithful Geyser Data"),
  
  # Sidebar with a slider input for number of bins 
  sidebarLayout(
    sidebarPanel(
      radioButtons("type_select", "What do you want to select?",
                   c("Rows" = "Rows",
                     "Columns" = "Columns")),
      uiOutput("picker"),
      actionButton("view", "View Selection")
      
    ),
    
    # Show a plot of the generated distribution
    mainPanel(
      h2('Mydata'),
      DT::dataTableOutput("table"),
    )
  )
)

library(shiny)
library(DT)

server <- function(session, input, output) {
  
  data <- reactive({
    iris
  })
  
  output$picker <- renderUI({
    pickerInput(inputId = 'pick', 
                label = 'Choose', 
                choices = colnames(data()),
                options = list(`actions-box` = TRUE),multiple = T)
  })
  
  datasetInput <- eventReactive(input$view,{
    
    datasetInput <- data() %>% 
      select(input$pick)
    
    return(datasetInput)
    
  })
  
  output$table <- renderDT({
    if(input$type_select == "Rows"){
        datatable(
          data(),
          selection = "none",
          filter="top", 
          rownames = FALSE,
          extensions = c("Buttons", "Select"),
          
          options = list(
            select = TRUE,
            dom = 'Blfrtip',
            buttons =
              list('copy', 'print', list(
                extend = 'collection',
                buttons = list(
                  list(extend = 'csv', filename = "File", title = NULL,
                       exportOptions = list(modifier = list(selected = TRUE))),
                  list(extend = 'excel', filename = "File", title = NULL,
                       exportOptions = list(modifier = list(selected = TRUE)))),
                text = 'Download'
              ))
          ),
          class = "display"
        )
    }else{
        datatable(
          datasetInput(),
          filter="top", 
          rownames = FALSE,
          extensions = 'Buttons',
          
          options = list(
            dom = 'Blfrtip',
            buttons =
              list('copy', 'print', list(
                extend = 'collection',
                buttons = list(
                  list(extend = 'csv', filename = "File", title = NULL),
                  list(extend = 'excel', filename = "File", title = NULL)),
                text = 'Download'
              ))
          ),
          class = "display"
        )
      }
  })
}


# Run the application 
shinyApp(ui = ui, server = server)

接下来,我将向您展示该应用程序的一些屏幕截图,以解释其工作原理。

如果选择“行”: 行

如果选择“列”: 列

事实上,如果你想检查选择是否顺利,你可以下载一个文件(例如excel),你会看到你的选择是好的。

但是,我不知道如何解决我上面解释的问题。

有人可以帮助我吗?我绝望了。

首先十分感谢

4

2 回答 2

2

摆脱警告更改renderDTDT::renderDataTable设置server = FALSE在其中。

这是完整的代码 -

ui <- fluidPage(
  
  # Application title
  titlePanel("Old Faithful Geyser Data"),
  
  # Sidebar with a slider input for number of bins 
  sidebarLayout(
    sidebarPanel(
      radioButtons("type_select", "What do you want to select?",
                   c("Rows" = "Rows",
                     "Columns" = "Columns")),
      uiOutput("picker"),
      actionButton("view", "View Selection")
      
    ),
    
    # Show a plot of the generated distribution
    mainPanel(
      h2('Mydata'),
      DT::dataTableOutput("table"),
    )
  )
)

library(shiny)
library(DT)

server <- function(session, input, output) {
  
  data <- reactive({
    iris
  })
  
  output$picker <- renderUI({
    pickerInput(inputId = 'pick', 
                label = 'Choose', 
                choices = colnames(data()),
                options = list(`actions-box` = TRUE),multiple = T)
  })
  
  datasetInput <- eventReactive(input$view,{
    
    datasetInput <- data() %>% 
      select(input$pick)
    
    return(datasetInput)
    
  })
  
  output$table <- DT::renderDataTable(server = FALSE,{
    if(input$type_select == "Rows"){
      datatable(
        data(),
        selection = "none",
        filter="top", 
        rownames = FALSE,
        extensions = c("Buttons", "Select"),
        
        options = list(
          select = TRUE,
          dom = 'Blfrtip',
          buttons =
            list('copy', 'print', list(
              extend = 'collection',
              buttons = list(
                list(extend = 'csv', filename = "File", title = NULL,
                     exportOptions = list(modifier = list(selected = TRUE))),
                list(extend = 'excel', filename = "File", title = NULL,
                     exportOptions = list(modifier = list(selected = TRUE)))),
              text = 'Download'
            ))
        ),
        class = "display"
      )
    }else{
      datatable(
        datasetInput(),
        filter="top", 
        rownames = FALSE,
        extensions = 'Buttons',
        
        options = list(
          dom = 'Blfrtip',
          buttons =
            list('copy', 'print', list(
              extend = 'collection',
              buttons = list(
                list(extend = 'csv', filename = "File", title = NULL),
                list(extend = 'excel', filename = "File", title = NULL)),
              text = 'Download'
            ))
        ),
        class = "display"
      )
    }
  })
}


# Run the application 
shinyApp(ui = ui, server = server)
于 2021-06-04T10:14:43.750 回答
0

我找到了所有问题的完整解决方案:

  • 警告(感谢 Ronak Shah 的回答)

  • 当我选择“行”时,如何从“pickerInput”和操作按钮中隐藏“选择输入”。感谢这篇文章

    library(shiny)
    library(shinyWidgets)
    library(dplyr)
    
    ui <- fluidPage(
    
    # Application title
    titlePanel("Old Faithful Geyser Data"),
    
    # Sidebar with a slider input for number of bins 
    sidebarLayout(
      sidebarPanel(
        radioButtons("type_select", "What do you want to select?",
                     c("Rows" = "Rows",
                       "Columns" = "Columns")),
    
        conditionalPanel(
          condition = "input.type_select == 'Columns'",
          uiOutput("picker"),
          actionButton("view", "View Selection")        
        )
    
      ),
    
      # Show a plot of the generated distribution
      mainPanel(
        h2('Mydata'),
        DT::dataTableOutput("table"),
      )
    )
    )
    
    
    library(shiny)
    library(DT)
    
    server <- function(session, input, output) {
    
    data <- reactive({
      iris
    })
    
    output$picker <- renderUI({
      pickerInput(inputId = 'pick', 
                  label = 'Choose', 
                  choices = colnames(data()),
                  options = list(`actions-box` = TRUE),multiple = T)
    })
    
    datasetInput <- eventReactive(input$view,{
    
      datasetInput <- data() %>% 
        select(input$pick)
    
      return(datasetInput)
    
    })
    
    output$table <- DT::renderDataTable(server = FALSE,{
      if(input$type_select == "Rows"){
        datatable(
          data(),
          selection = "none",
          filter="top", 
          rownames = FALSE,
          extensions = c("Buttons", "Select"),
    
          options = list(
            select = TRUE,
            dom = 'Blfrtip',
            buttons =
              list('copy', 'print', list(
                extend = 'collection',
                buttons = list(
                  list(extend = 'csv', filename = "File", title = NULL,
                       exportOptions = list(modifier = list(selected = TRUE))),
                  list(extend = 'excel', filename = "File", title = NULL,
                       exportOptions = list(modifier = list(selected = TRUE)))),
                text = 'Download'
              ))
          ),
          class = "display"
        )
      }else{
        datatable(
          datasetInput(),
          filter="top", 
          rownames = FALSE,
          extensions = 'Buttons',
    
          options = list(
            dom = 'Blfrtip',
            buttons =
              list('copy', 'print', list(
                extend = 'collection',
                buttons = list(
                  list(extend = 'csv', filename = "File", title = NULL),
                  list(extend = 'excel', filename = "File", title = NULL)),
                text = 'Download'
              ))
          ),
          class = "display"
        )
      }
    })
    }
    
    
    # Run the application 
    shinyApp(ui = ui, server = server)
    

添加条件面板后的一些截图:

如果选择行...

行

如果选择列...

列

警告。如果您只想选择 X 列以下载它们,则此解决方案不起作用(例如,您只想下载 25 个条目,但如果您下载文件,您将没有 25 个条目,您将拥有一切。

于 2021-06-04T11:13:26.357 回答