如何从使用ReactiveFileReader导入的数据中提取值?

时间:2019-06-18 01:58:45

标签: r shiny datatables shiny-reactivity

我使用reactiveFileReader加载数据,并想提取诸如列名之类的值以在tableHeader函数中使用它。但是,我不理解如何不通过render*函数就如何独自使用数据。有人可以协助吗?

    reactive_api_data <- reactiveFileReader(
        intervalMillis = 1000,
        session = session, 
        filePath = "data/data.csv",
        readFunc = read_csv
    )

    sketch <- htmltools::withTags(table(
        tableHeader(c("date", "a", "b", "c", "d", "e", "f", "g")), 
        tableFooter(c("Total",0,0,0,0,0,0,0))
    ))

    output$data_2019 <- DT::renderDataTable({ 
        reactive_api_data() %>% 
            filter(date > "2019-01-01")
    }, 
    container = sketch, 
    rownames = FALSE,
    options = list(paging = FALSE, searching = FALSE, lengthMenu = FALSE,
                      footerCallback = JS(
                          "function(row, data, start, end, display) {",
                          "var api = this.api(), data;",
                          "total = api.column(2).data().reduce( function(a, b) { return a + b }, 0);",
                          "$( api.column(2).footer() ).html(total);",
                          "}"
                          )
                      )

我想做类似的事情

tableHeader(colnames(data))

而不是像上面的代码中那样手动键入列名称:

tableHeader(c("date", "a", "b", "c", "d", "e", "f", "g"))

1 个答案:

答案 0 :(得分:0)

我将sketch更改为一个反应函数,以在renderDataTable内部调用。

reactive_api_data <- reactiveFileReader(
        intervalMillis = 1000,
        session = session, 
        filePath = "data/data.csv",
        readFunc = read_csv
    )

sketch <- reactive({ 
        htmltools::withTags(
            table(
                DT::tableHeader(colnames(reactive_api_data())), 
                DT::tableFooter(c("Total",0,0,0,0,0,0,0))
            )
        )
    })

output$data_2019 <- DT::renderDataTable({ 
        reactive_api_data() %>% 
            filter(date > "2019-01-01")
    }, 
    container = sketch(), 
    rownames = FALSE,
    options = list(paging = FALSE, searching = FALSE, lengthMenu = FALSE,
        footerCallback = JS(
            "function(row, data, start, end, display) {",
            "var api = this.api(), data;",
            "total = api.column(2).data().reduce( function(a, b) { return a + b }, 0);",
            "$( api.column(2).footer() ).html(total);",
            "}"
        )
    )