R Shiny renderTable - cara mengubah lebar dan warna batas

Saya mungkin memiliki pertanyaan sederhana tetapi karena saya tidak terlalu paham dengan CSS/html, saya kesulitan untuk memecahkan masalah berikut. Di ui saya, saya memiliki tabel sederhana berikut:

tableOutput("retail_dashboard_ratios_table")

di server, saya punya kode yang sangat sederhana ini:

output$retail_dashboard_ratios_table <- renderTable({  #
df <- head(mtcars)
})

Yang perlu saya lakukan hanyalah mengatur lebar batas dan warna batas (menjadi biru). Saya wajib menggunakan versi R 3.4. Karena saya memiliki tableOutput statis, saya tidak dapat (tampaknya) menggunakan solusi yang disebutkan di Tambahkan Batas Sel dalam R Datatable karena saya tidak dapat mengembalikan objek datatable.

Saya juga membaca R renderTable mengkilap mengubah warna sel yang memiliki solusi yang sangat menarik, tetapi mengingat versi R saya, sepertinya perpustakaan (tableHTML) tidak kompatibel.

Saya ingin tahu apakah ada yang punya solusi sederhana untuk memperbaiki perbatasan. Terima kasih


Terima kasih kepada @Patrick Altmeyer, ini adalah solusi terakhir yang berfungsi!

source("global.R") 

today <- as.character()

ui <- dashboardPage(  
  title = "Dashboard of the Municipal Market",  # this is the name of the tab in Chrome browserr
  dashboardHeader(title = "Web Portal"),

  dashboardSidebar(   
    sidebarMenu(

      menuItem('Retail', tabName = "retail", icon = icon("th"),
               menuItem('Dashboard', tabName = 'retail_dashboard'))
    )
  ),

  dashboardBody( 
      tabItem(tabName = "retail_dashboard",
              tabsetPanel(type = "tabs",
                          tabPanel("Dashboard",
                                   h3("Test."),

                                   tags$head(
                     tags$style(HTML("
                                                .my_table_aa01 .table>tbody>tr>td, .table>tbody>tr>th, .table>tfoot>tr>td, .table>tfoot>tr>th, .table>thead>tr>td, .table>thead>tr>th {
                                                border-collapse: collapse;
                                                }

                                                .my_table_aa01 th {
                                                 border: 1px solid black !important;
                                                 text-align: center !important;
                                                 vertical-align: middle !important;
                                                 color: white !important;
                                                 background-color: #615858 !important;
                                                 white-space: nowrap;
                                                 border-bottom: none}

                                                .my_table_aa01 td {padding: 1rem;
                                                border: 1px solid black;}

                                                .my_table_aa01 tr:first-child {
                                                  border : 1px solid black;
                                                 border-top: 1px solid black;}

                                                 .my_table_aa01 tr:nth-child(even){
                                                 background-color: #afd19d;
                                                 color: black;
                                                 font-size:16px;}

                                                 .my_table_aa01 tr:nth-child(odd){
                                                 background-color: white;
                                                 color: black;
                                                 font-size:16px;
                                                 }
                                                "))),

                                   fluidRow(column(2,
                                                   actionButton(inputId = "retail_dashboard_load_data_btn", label = "Load / Refresh Data")),
                                            column(2,
                                                   downloadButton("download_dashboard_data","Download Data"))),

                                   fluidRow(
                                     column(2, 
                                            dateInput("retail_dashboard_start_dt", label = ("Start Date"), value = glob_date_1yr_ago)),
                                     column(2, 
                                            dateInput("retail_dashboard_end_dt", label = ("End Date"), value = glob_previous_to_most_recent_date_with_quant_model_regression_data))
                                   ),


                                   br(),
                                   fluidRow(column(6,
                                                   div(textOutput(outputId = "retail_dashboard_error_log")))),
                                   br(),

                                   fluidRow(column(3,
                                                   plotlyOutput(outputId = "retail_dashboard_plot1", width = '350', height = '350px')),
                                            column(3,
                                                   offset = 0,
                                                   tags$div(
                                                     class="my_table_aa01", # set to custom class
                                                     tableOutput("retail_dashboard_ratios_table") )


                                            )),
                                   fluidRow(column(3,
                                                   tableOutput("retail_dashboard_table2")))
                                     )
                                     )             
              )
              )
)


server <- function(input, output, session) {    
  source("Page_retail_dash.R", local=T) 


}

cat("\nLaunching   'shinyApp' ....")
shinyApp(ui, server)

person Angelo    schedule 16.06.2020    source sumber
comment
@SusanSwitzer pertanyaan bagus. Perkenankan saya untuk menjelaskan. Tujuan saya yang sebenarnya adalah memiliki satu baris petak kecil dan juga meja kecil. Saya mencoba mencapai tujuan itu dengan menggunakan fluidRow( kolom(3, plotlyOutput(outputId = retail_dashboard_plot1, lebar = '350', tinggi = '350px')), kolom(3, offset = 0, dataTableOutput(retail_dashboard_ratios_table), )) tetapi tata letaknya menjadi benar-benar kacau   -  person Angelo    schedule 17.06.2020
comment
@SusanSwitzer pada kenyataannya tableOutput mungkin adalah semua yang saya butuhkan, saya hanya mencoba mencari cara untuk menyesuaikan batasnya. Sejauh ini saya berhasil memperbarui kode di ui menjadi: tableOutput(retail_dashboard_ratios_table), tag$style(type=text/css, #retail_dashboard_ratios_table tr:last-child {font-weight:bold;}) dan kode ini sepertinya berhasil baris terakhir dicetak tebal. (Saya menemukannya secara acak online). Jadi saya kira ada cara dengan css untuk menyesuaikan perbatasan juga   -  person Angelo    schedule 17.06.2020
comment
Coba instal tableHTML versi lama   -  person Seyma Kalay    schedule 17.06.2020


Jawaban (1)


Solusi yang lebih elegan mungkin dapat digunakan dengan style sheet, tetapi jika hanya satu tabel yang ingin Anda gaya, Anda cukup menambahkan CSS ke header HTML seperti di bawah ini. Informasi selengkapnya mengenai hal ini dapat ditemukan di sini. Saya menemukan bahwa bagian yang sulit sering kali adalah mengetahui kelas apa yang harus ditimpa seperti dalam kasus ini .table>tbody>tr>td, .... Namun cara sederhana untuk menemukan apa yang Anda cari adalah dengan memeriksa HTML saat runtime, mis. di Google Chrome Anda akan mengklik kanan + "Periksa" di mana saja di jendela browser (sebaiknya di dekat elemen yang ingin Anda gaya). Anda kemudian dapat mengedit gaya di browser saat runtime untuk melihat pratinjau bagaimana perubahan pada CSS akan memengaruhi tampilan aplikasi Anda. Saya juga tidak terlalu paham dengan CSS, tetapi pendekatan ini biasanya membawa banyak manfaat bagi saya.

Semoga ini membantu!

shinyApp(

  # --- User Interface --- #

  ui = fluidPage(

    # The below overwrites the default styling for the top border of table cells. 
    # I've changed the colour to blue from grey and the width to 3px from 1px.
    tags$head(
      tags$style(HTML("
      .table>tbody>tr>td, .table>tbody>tr>th, .table>tfoot>tr>td, .table>tfoot>tr>th, .table>thead>tr>td, .table>thead>tr>th {
        padding: 8px;
        line-height: 1.42857143;
        vertical-align: top;
        border-top: 3px solid blue; 
      }
    "))
    ),

    mainPanel(
      tableOutput("retail_dashboard_ratios_table")
    )

  ),

  # --- Server logic --- #

  server = function(input, output) {
    output$retail_dashboard_ratios_table <- renderTable({  #
      df <- head(mtcars)
    })
  }

)

Edit

Jika Anda ingin menyetel gaya untuk satu tabel saja, bukan semua tabel di aplikasi Anda, Anda perlu membuat kelas CSS Anda sendiri untuknya. Anda bisa memberikan nama empat kelas dengan cukup mudah hanya dengan menulis misalnya .my_table atau #my_table di depan kode CSS yang ada di atas. Jadi untuk melengkapi contoh di atas, tetapi sekarang dengan gaya individual:

shinyApp(

  # --- User Interface --- #

  ui = fluidPage(

    # The below now creates a custum css class. 
    tags$head(
      tags$style(HTML("
      .my_table .table>tbody>tr>td, .table>tbody>tr>th, .table>tfoot>tr>td, .table>tfoot>tr>th, .table>thead>tr>td, .table>thead>tr>th {
        padding: 8px;
        line-height: 1.42857143;
        vertical-align: top;
        border-top: 3px solid blue; 
      }
    "))
    ),

    mainPanel(
      h3("Custom style table:"),
      tags$div(
        class="my_table", # set to custom class
        tableOutput("custom_table")
      ),
      h3("Default style table:"),
      tableOutput("default_table"), # No class assigned
      h3("Another default style table:"),
      tableOutput("another_default_table") # No class assigned
    )

  ),

  # --- Server logic --- #

  server = function(input, output) {
    output$custom_table <- renderTable({  #
      df <- head(mtcars)
    })

    output$default_table <- renderTable({  #
      df <- head(iris)
    })

    output$another_default_table <- renderTable({  #
      df <- head(cars)
    })
  }

)

Di bawah ini adalah output yang dihasilkan kode: masukkan deskripsi gambar di sini

person patalt    schedule 17.06.2020
comment
Terima kasih Patrick. Tolong, izinkan saya satu pertanyaan klarifikasi. Saya memeriksa halaman web dan kelas yang ditugaskan ke elemen tabel adalah output-html-mengkilat-output-terikat. Kemudian, saya mencoba menggunakan: tag$style(HTML('.shiny-html-output glossy-bound-output {border-collapse: collaps; font-size:20px; color:red; })) tetapi perubahan ini berdampak pada semua tabel di aplikasi saya yang mengkilap. Apakah ada cara untuk menghindarinya? - person Angelo; 17.06.2020
comment
Terima kasih @Angelo, saya sudah mengedit jawabannya. Contoh kedua melakukan apa yang ingin Anda capai. Daripada menimpa gaya default untuk semua tabel, dalam hal ini Anda ingin membuat kelas khusus untuk tabel individual tersebut. Ini akan bekerja dengan cara yang persis sama untuk tag gaya yang Anda sarankan di komentar Anda. Kelas khusus dapat digunakan kembali di mana saja dalam aplikasi dengan cara yang sama. Jika Anda mulai menambahkan lebih banyak CSS ke aplikasi Anda, Anda harus mempertimbangkan untuk memasukkan semua kode CSS itu ke dalam stylesheet. Semoga ini membantu! - person patalt; 17.06.2020
comment
terima kasih atas semua bantuannya sejauh ini! Apa yang Anda tampilkan dalam kode masuk akal bagi saya, tetapi entah bagaimana, ketika saya memeriksa tabel lain, tabel tersebut sekarang menampilkan format yang sama dengan kelas .my_table. Apakah mungkin ada sesuatu yang hilang? - person Angelo; 17.06.2020
comment
Hmm aneh sekali, saya telah menambahkan gambar output yang dihasilkan oleh kode saya. Sudahkah Anda mencoba menyalin kode ke konsol R dan menjalankannya? Saya telah mencoba memperjelas cara menetapkan kelas CSS (dan di mana tidak). Semoga ini menjelaskannya! - person patalt; 17.06.2020
comment
Hai Patrick, saya akan 95% dari seluruh kode saya di pertanyaan awal saya. Saya menggunakan logika Anda yang sama dan dua tabel yang saya cetak pada halaman yang sama memiliki format yang sama meskipun seharusnya tidak demikian - person Angelo; 17.06.2020
comment
maaf sudah membuatmu gila. Saya benar-benar menghapus sebagian besar hal-hal yang tidak berguna dalam kode saya dan menempelkan apa yang saya miliki dalam pertanyaan awal saya di atas. Jika saya menjalankan aplikasi, baik retail_dashboard_ratios_table maupun retail_dashboard_table2 menunjukkan format yang persis sama - person Angelo; 17.06.2020
comment
Saya tidak yakin harus berbuat apa lagi @Angelo. Anda dapat memverifikasi bahwa kode saya berfungsi, mungkin mulai dari sana dan menyesuaikannya dengan kasus penggunaan Anda. - person patalt; 17.06.2020
comment
Maaf, saya baru sekarang melihat Anda menambahkan lebih banyak kode. Saya jauh dari laptop saya, tetapi saya akan memeriksanya nanti apakah Anda sudah berhasil menyelesaikannya saat itu. - person patalt; 17.06.2020
comment
Saya menjalankan kelas Anda dan berfungsi dengan baik, sepertinya karena sesuatu dalam definisi kelas saya. Mungkin karena saya menentukan warna latar belakang header dan baris, hal ini menyebabkan konflik di suatu tempat? - person Angelo; 18.06.2020
comment
Patrick, saya mengonfirmasi bahwa skrip saya tidak menyukai kenyataan bahwa saya menyesuaikan header dan baris tabel :/ menurut Anda apakah ini sesuatu yang mudah untuk diperbaiki? - person Angelo; 18.06.2020
comment
Aku telah memperbaikinya! Saya hanya perlu menambahkan .my_table_aa01 ke setiap elemen tabel yang ingin saya sesuaikan. TERIMA KASIH BANYAK Patrick!!! - person Angelo; 18.06.2020
comment
@Angelo senang melihat Anda menemukan jawabannya! Senang aku dapat membantu - person patalt; 18.06.2020