R Блестящий DT: автоматическое выравнивание числовых столбцов справа

#r #shiny #dt #right-align

Вопрос:

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

К сожалению, в реальном приложении shiny я каждый раз не знаю, сколько у меня будет числовых столбцов, поэтому мне нужен способ их автоматического выбора, чтобы выровнять их.

Это должно быть однострочное, но до сих пор мне это не удавалось. Кто-нибудь может мне здесь помочь? Большое спасибо!

 library(shiny)
library(tidyverse)
library(DT)
#> 
#> Attaching package: 'DT'
#> The following objects are masked from 'package:shiny':
#> 
#>     dataTableOutput, renderDataTable



round_all <-  function(df, n){


res <- df %>% mutate(across(where(is.numeric), ~round(.x,n) ))

    
return(res)

}


set.seed(1234)

df <- tibble(x=letters[1:5], y=LETTERS[10:14],
             w=rnorm(5), z=rnorm(5)) %>%
    round_all(2)


ui <- fluidPage(

mainPanel(DTOutput("table"))
    
)


server <- function(input, output) {

    output$table <- renderDT({datatable(df)} %>%
                             formatStyle(columns=c("w", "z"),
                                         textAlign = 'right')
              )


}





shinyApp(ui = ui, server = server)
#> 
#> Listening on http://127.0.0.1:7374
 

Создано 2021-09-21 пакетом reprex (v2.0.1)

Ответ №1:

Вы можете написать, например numeric_cols <- df %>% keep(is.numeric) %>% colnames() :

 library(shiny)
library(tidyverse)
library(DT)

round_all <- function(df, n) {
  res <- df %>% mutate(across(where(is.numeric), ~ round(.x, n)))

  return(res)
}


set.seed(1234)

df <- tibble(
  x = letters[1:5], y = LETTERS[10:14],
  w = rnorm(5), z = rnorm(5)
) %>%
  mutate_if(is.numeric, ~ .x %>% round(2))

ui <- fluidPage(
  mainPanel(DTOutput("table"))
)


server <- function(input, output) {
  numeric_cols <- df %>% keep(is.numeric) %>% colnames()
  
  output$table <- renderDT({
    datatable(df)
  } %>%
    formatStyle(
      columns = numeric_cols,
      textAlign = "right"
    ))
}

shinyApp(ui = ui, server = server)
 

Комментарии:

1. Спасибо! Именно то, что я искал.