如何在Shinny R的文件上传示例中使用renderDataTable

时间:2014-11-10 22:41:09

标签: r shiny rstudio shiny-server

我正在尝试创建我的第一个Shiny R应用程序,它执行两项操作:

  1. 显示用户上传的CSV文件
  2. 计算用户选定的行数
  3. 要实现这些功能,我需要合并两个示例file uploadrow selection,其中包括将renderTable切换为renderDataTable。但是,我只能使用renderDataTable显示数据,但无法将callbackoptions之类的参数传递给它。

    这是server.R代码

    shinyServer(function(input, output) {
      output$contents <- renderDataTable({
        inFile <- input$file1
        if (is.null(inFile))
            return(NULL)
        subset(read.csv(inFile$datapath, header=input$header, sep=input$sep, quote=input$quote), select=input$show_vars)
      })
    })
    

    如果我在这种情况下更改了上述功能(如下),我收​​到了以下错误server.R:9:5: unexpected 'if'。我认为这与构建一个被动文件上传应用程序有关,我找不到好的例子......有人能给我一些建议吗?谢谢!

    shinyServer(function(input, output) {
      output$contents <- renderDataTable(
        inFile <- input$file1
        if (is.null(inFile))
          return(NULL)
       subset(read.csv(inFile$datapath, header=input$header, sep=input$sep, quote=input$quote), select=input$show_vars),
       options = list(pageLength = 10),
       callback = "function(table) {
             table.on('click.dt', 'tr', function() {
               $(this).toggleClass('selected');
               Shiny.onInputChange('rows',
                                   table.rows('.selected').indexes().toArray());
             });
           }"
      )
    })
    

1 个答案:

答案 0 :(得分:1)

renderDataTable的第一个参数应该是一个表达式。您需要将代码包装在花括号中,以将第一部分代码作为表达式传递:

shinyServer(function(input, output) {
  output$contents <- renderDataTable({
    inFile <- input$file1
    if (is.null(inFile))
      return(NULL)
    subset(read.csv(inFile$datapath, header=input$header, sep=input$sep, quote=input$quote), select=input$show_vars)
  }
  , options = list(pageLength = 10),
  , callback = "function(table) {
         table.on('click.dt', 'tr', function() {
           $(this).toggleClass('selected');
           Shiny.onInputChange('rows',
                               table.rows('.selected').indexes().toArray());
         });
       }"
  )
})