Расчет совокупных значений по выбранным строкам в DT

Я хочу иметь возможность выбрать несколько строк в DT и иметь совокупный процент от значения столбца, представленного в flexdashboard калибровать. Мне нужно позвонить из выбранных строк, так как я планирую использовать это с crosstalkгде строки будут выбраны на точечных графиках или картах.

Этот пример с игрушкой позволяет мне создать DT, где я могу щелкнуть строки 2-10 и распечатать selectedRow() покажет мне совокупную сумму столбца Petal.width, а индикатор отобразит сумму именно так, как я хочу.

library(shiny)
library(DT)
library(flexdashboard)
shinyApp(
  ui = fluidPage(
    textOutput('list'),
    DTOutput('table'),
    flexdashboard::gaugeOutput("plt1")
  ),
  server = function(input, output, session) {

    iris2<-iris %>% mutate(perc=round((Petal.Width/sum(Petal.Width))*100,1))

    selectedRow <- eventReactive(input$table_rows_selected,{
      selrow<-cumsum(iris2$perc)[c(input$table_rows_selected)]
      tail(selrow, n=1)
    })

    output$plt1 <- flexdashboard::renderGauge({
      gauge(selectedRow(), min = 0, max = 100, symbol = '%', gaugeSectors(
        success = c(80, 100), warning = c(40, 79), danger = c(0, 39)))
    })

    output$list<-renderText({
      selectedRow()
    })

    output$table <- renderDT({iris2})

  }
)

ui <- fluidPage(
  mainPanel(
    verbatimTextOutput('list'),
    dataTableOutput('table')
  )
)

Однако, если я выбираю строки 2-10, а затем выбираю первую строку, датчик сбрасывается до значения, присутствующего только в первой строке. Я просмотрел документацию DT и не смог найти очевидного способа изменить это, поэтому я попытался выбрать только хвост cumsum значение в selectedRow() но это не сработало.

Есть ли способ получить реактивно выбранную совокупную сумму Petal.width, независимо от порядка, в котором выбираются строки DT?

1 ответ

Решение

С помощью sum() вместо cumsum() Кажется, работает на меня.

library(shiny)
library(DT)
library(tidyverse)
library(flexdashboard)
shinyApp(
 ui = fluidPage(
textOutput('list'),
DTOutput('table'),
flexdashboard::gaugeOutput("plt1")
),
server = function(input, output, session) {

iris2<-iris %>% mutate(perc=round((Petal.Width/sum(Petal.Width))*100,1))

selectedRow <- eventReactive(input$table_rows_selected,{
  selrow<-sum(iris2$perc[c(input$table_rows_selected)])

})

output$plt1 <- flexdashboard::renderGauge({
  gauge(selectedRow(), min = 0, max = 100, symbol = '%', gaugeSectors(
    success = c(80, 100), warning = c(40, 79), danger = c(0, 39)))
})

output$list<-renderText({
  selectedRow()
})

output$table <- renderDT({iris2})

})
Другие вопросы по тегам