Расчет совокупных значений из выбранных строк в DT - PullRequest
0 голосов
/ 09 июня 2018

Я хочу иметь возможность выбрать несколько строк в 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 Ответ

0 голосов
/ 11 июня 2018

Использование 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})

})
...