R Shiny renderTable - วิธีเปลี่ยนความกว้างและสีของเส้นขอบ

ฉันอาจมีคำถามง่ายๆ แต่เนื่องจากฉันไม่คุ้นเคยกับ CSS/htlm มากนัก ฉันจึงมีเวลายากที่จะทราบปัญหาต่อไปนี้ ใน UI ของฉันฉันมีตารางง่าย ๆ ดังต่อไปนี้:

tableOutput("retail_dashboard_ratios_table")

ในเซิร์ฟเวอร์ ฉันมีโค้ดง่ายๆ นี้:

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

สิ่งที่ฉันต้องทำคือตั้งค่าความกว้างของเส้นขอบและสีของเส้นขอบ (เป็นสีน้ำเงิน) ฉันจำเป็นต้องใช้เวอร์ชัน R 3.4 เนื่องจากฉันมี tableOutput แบบคงที่ ฉันจึงไม่สามารถใช้วิธีแก้ปัญหาที่กล่าวถึงใน เพิ่มขอบเขตเซลล์ใน R Datatable เนื่องจากฉันไม่สามารถส่งคืนออบเจ็กต์ DataTable ได้

ฉันยังได้อ่าน R Shiny renderTable เปลี่ยนสีของเซลล์ ซึ่งมีวิธีแก้ปัญหาที่น่าสนใจมาก แต่ด้วยเวอร์ชัน R ของฉัน ดูเหมือนว่าไลบรารี (tableHTML) เข้ากันไม่ได้

ฉันสงสัยว่ามีใครมีวิธีแก้ไขง่ายๆ เพียงแก้ไขขอบเขตหรือไม่ ขอบคุณ


ขอบคุณ @Patrick Altmeyer นี่เป็นวิธีแก้ปัญหาการทำงานขั้นสุดท้าย!

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 แหล่งที่มา
comment
@SusanSwitzer คำถามที่ดี ขออนุญาติอธิบายครับ. เป้าหมายที่แท้จริงของฉันคือให้มีทั้งแปลงเล็กและโต๊ะเล็กในแถวเดียว ฉันพยายามบรรลุเป้าหมายนั้นโดยใช้ FluidRow( column(3, plotlyOutput(outputId = Retail_dashboard_plot1, width = '350', height = '350px')), column(3, offset = 0, dataTableOutput(retail_dashboard_ratios_table), )) แต่ เลย์เอาต์เสียหายไปหมด   -  person Angelo    schedule 17.06.2020
comment
@SusanSwitzer ในความเป็นจริง tableOutput อาจเป็นสิ่งที่ฉันต้องการ ฉันแค่พยายามหาวิธีปรับแต่งเส้นขอบ จนถึงตอนนี้ฉันสามารถอัปเดตโค้ดใน ui เป็น: tableOutput(retail_dashboard_ratios_table), tags$style(type=text/css, #retail_dashboard_ratios_table tr:last-child {font-weight:bold;}) และดูเหมือนว่าโค้ดนี้จะทำให้ แถวสุดท้ายเป็นตัวหนา (ฉันเจอมันแบบสุ่มในอินเตอร์เน็ต) ฉันเดาว่าคงมีวิธีที่ CSS จะปรับแต่งเส้นขอบได้เช่นกัน   -  person Angelo    schedule 17.06.2020
comment
ลองติดตั้ง tableHTML เวอร์ชันเก่า   -  person Seyma Kalay    schedule 17.06.2020


คำตอบ (1)


โซลูชันที่หรูหรากว่านี้อาจใช้ได้กับสไตล์ชีต แต่ถ้าเป็นเพียงตารางเดียวที่คุณพยายามจัดสไตล์ คุณก็สามารถเพิ่ม CSS ลงในส่วนหัว HTML ได้ดังด้านล่างนี้ ดูข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ที่นี่ ฉันพบว่าส่วนที่ยุ่งยากมักจะต้องรู้ว่าคลาสใดที่จะเขียนทับในกรณีนี้ .table>tbody>tr>td, ... แต่วิธีง่ายๆ ในการค้นหาสิ่งที่คุณกำลังมองหาคือการตรวจสอบ HTML ณ รันไทม์ เช่น ใน Google Chrome คุณจะต้องคลิกขวา + "ตรวจสอบ" ที่ใดก็ได้ในหน้าต่างเบราว์เซอร์ (ควรใกล้กับองค์ประกอบที่คุณต้องการจัดสไตล์) จากนั้น คุณจะแก้ไขสไตล์ในเบราว์เซอร์ขณะรันไทม์ได้เพื่อดูตัวอย่างว่าการเปลี่ยนแปลง CSS จะส่งผลต่อรูปลักษณ์ภายนอกแอปของคุณอย่างไร ฉันก็ไม่ค่อยคุ้นเคยกับ CSS เหมือนกัน แต่วิธีนี้มักจะทำให้ฉันเข้าใจได้ไกล

หวังว่านี่จะช่วยได้!

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)
    })
  }

)

แก้ไข

ในกรณีที่คุณต้องการตั้งค่าสไตล์ให้กับตารางเดียวเท่านั้น แทนที่จะสร้างตารางทั้งหมดในแอปของคุณ คุณจะต้องสร้างคลาส CSS ของคุณเอง คุณสามารถตั้งชื่อคลาสสี่ได้อย่างง่ายดายโดยเพียงแค่เขียน เช่น .my_table หรือ #my_table หน้าโค้ด CSS ที่มีอยู่ด้านบน เพื่อให้ตัวอย่างข้างต้นสมบูรณ์ แต่ตอนนี้มีสไตล์เฉพาะบุคคล:

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)
    })
  }

)

ด้านล่างนี้คือเอาต์พุตที่โค้ดสร้างขึ้น: ป้อนคำอธิบายรูปภาพที่นี่

person patalt    schedule 17.06.2020
comment
ขอบคุณแพทริค ขออนุญาติถามชี้แจงหนึ่งคำถามครับ ฉันตรวจสอบหน้าเว็บและคลาสที่กำหนดให้กับองค์ประกอบตารางคือ Shiny-html-output Shiny-bound-output จากนั้น ฉันลองใช้: tags$style(HTML('.shiny-html-output Shiny-bound-output {border-collapse: allowance; font-size:20px; color:red; })) แต่การเปลี่ยนแปลงนี้ส่งผลต่อทั้งหมด ตารางในแอปแวววาวของฉัน มีวิธีหลีกเลี่ยงหรือไม่? - person Angelo; 17.06.2020
comment
ขอบคุณ @Angelo ฉันได้แก้ไขคำตอบแล้ว ตัวอย่างที่สองทำสิ่งที่คุณต้องการบรรลุ แทนที่จะเขียนทับสไตล์เริ่มต้นสำหรับตารางทั้งหมด ในกรณีนี้ คุณต้องการสร้างคลาสแบบกำหนดเองสำหรับแต่ละตารางนั้น วิธีนี้จะทำงานในลักษณะเดียวกับแท็กสไตล์ที่คุณแนะนำในความคิดเห็นของคุณทุกประการ คลาสที่กำหนดเองสามารถนำกลับมาใช้ซ้ำได้ทุกที่ในแอปในลักษณะเดียวกัน หากคุณเริ่มเพิ่ม CSS ให้กับแอปของคุณ คุณควรพิจารณาเพียงแค่ใส่โค้ด CSS ทั้งหมดนั้นลงในสไตล์ชีต หวังว่านี่จะช่วยได้! - person patalt; 17.06.2020
comment
ขอบคุณสำหรับความช่วยเหลือทั้งหมดจนถึงตอนนี้! สิ่งที่คุณแสดงในโค้ดนั้นสมเหตุสมผลสำหรับฉัน แต่อย่างใด เมื่อฉันตรวจสอบตารางอื่น ตอนนี้พวกเขาแสดงรูปแบบเดียวกันกับคลาส .my_table บางทีอาจมีบางอย่างหายไป? - person Angelo; 17.06.2020
comment
อืม มันแปลกมาก ฉันได้เพิ่มรูปภาพของผลลัพธ์ที่สร้างโดยโค้ดของฉันแล้ว คุณได้ลองคัดลอกโค้ดลงในคอนโซล R แล้วใช้งานหรือไม่? ฉันได้พยายามทำให้ชัดเจนยิ่งขึ้นว่าจะกำหนดคลาส CSS อย่างไร (และที่ใดที่ไม่ควร) หวังว่านี่จะกระจ่างขึ้น! - person patalt; 17.06.2020
comment
สวัสดีแพทริค ฉันจะ 95% ของโค้ดทั้งหมดของฉันในคำถามเริ่มแรก ฉันใช้ตรรกะเดียวกันของคุณและตารางทั้งสองที่ฉันพิมพ์ในหน้าเดียวกันมีรูปแบบเดียวกันแม้ว่าจะไม่ควรเป็นเช่นนั้นก็ตาม - person Angelo; 17.06.2020
comment
ขอโทษที่ทำให้คุณบ้า ฉันลบสิ่งที่ไร้ประโยชน์ส่วนใหญ่ออกจากโค้ดของฉันอย่างแท้จริง และวางสิ่งที่ฉันมีไว้ในคำถามเริ่มแรกด้านบน หากฉันเรียกใช้แอป ทั้ง Retail_dashboard_ratios_table และ Retail_dashboard_table2 จะแสดงรูปแบบเดียวกันทุกประการ - person Angelo; 17.06.2020
comment
ฉันไม่แน่ใจว่าจะต้องทำอะไรอีก @Angelo คุณสามารถตรวจสอบได้ว่าโค้ดของฉันใช้งานได้หรือไม่ อาจเริ่มจากตรงนั้นและปรับให้เข้ากับกรณีการใช้งานของคุณ - person patalt; 17.06.2020
comment
ขออภัย ฉันเพิ่งเห็นว่าคุณเพิ่มโค้ดเพิ่มเติม ฉันไม่ได้อยู่ที่แล็ปท็อป แต่จะลองดูในภายหลังเผื่อว่าคุณจะแก้ไขปัญหาได้ภายในเวลานั้น - person patalt; 17.06.2020
comment
ฉันดำเนินการชั้นเรียนของคุณและทำงานได้ดี ดูเหมือนว่าจะเป็นเพราะบางอย่างในคำจำกัดความของชั้นเรียนของฉัน บางทีเนื่องจากฉันกำหนดสีพื้นหลังของส่วนหัวและแถวจึงทำให้เกิดข้อขัดแย้งในที่ใดที่หนึ่ง - person Angelo; 18.06.2020
comment
แพทริค ฉันขอยืนยันว่าสคริปต์ของฉันไม่ชอบความจริงที่ว่าฉันปรับแต่งส่วนหัวและแถวของตาราง :/ คุณคิดว่ามันแก้ไขได้ง่ายไหม - person Angelo; 18.06.2020
comment
ฉันซ่อมมัน! ฉันแค่ต้องเพิ่ม .my_table_aa01 ลงในแต่ละองค์ประกอบของตารางที่ฉันต้องการปรับแต่ง ขอบคุณมากแพทริค !!! - person Angelo; 18.06.2020
comment
@Angelo ดีใจที่ได้เห็นคุณคิดออก! ดีใจที่สามารถช่วยได้ - person patalt; 18.06.2020