2017-12-20 84 views
0

1 개의 반짝이는 페이지에 여러 개의 데이터 프레임을 표시하기 위해 R의 Shiny 앱을 작성 중입니다. 조건부 포맷 1 데이터 테이블을 Shiny에서 사용할 수 있지만 조건부로 6 개의 테이블을 모두 포맷 할 수는 없습니다. 6 개 각 테이블은 5 개 변수를 가지고 있고 모든 데이터 테이블에서 두번째 변수를 원하는 : 배경 빛까지 빨간색 굵은 경우> = 75, 및 < = 75 경우 녹색 굵은 점등 :Shiny R의 조건부 형식 다중 테이블

library(shiny) 
ui <- fluidPage(
    titlePanel("xxx"), 
    title = 'xx', 
    fluidRow(
column(6 
     , fluidRow(
      column(6, DT::dataTableOutput('1'), style = "font-size: 
       75%; width: 50%"), 
      column(6, DT::dataTableOutput('2'), style = "font-size: 
      75%; width: 50%") 
     ), 
     # hr(), 
     fluidRow(
      column(6, DT::dataTableOutput('3'), style = "font-size: 
       75%; width: 50%"), 
      column(6, DT::dataTableOutput('4'), style = "font-size: 
       75%; width: 50%") 
     ), 
     # hr(), 
     fluidRow(
      column(6, DT::dataTableOutput('5'), style = "font-size: 
       75%; width: 50%"), 
      column(6, DT::dataTableOutput('6'), style = "font-size: 
       75%; width: 50%") 
     ) 
    ) 
    server <- function(input, output) { 
      output$1 = DT::renderDataTable(1 
        , server = FALSE, selection = 'single' 
        , options = list(rowCallback = JS('function(nRow 
        , aData, iDisplayIndex, iDisplayIndexFull) { 
        // Bold and green cells for conditions 
        if (parseFloat(aData[2]) 
         >= 75 | parseFloat(aData[2]) <= -75) 
         $("td:eq(2)", nRow).css("font-weight", "bold"); 
         if (parseFloat(aData[2]) >= 75) 
         $("td:eq(2)", nRow).css("background-color" 
         , "#FF0000"); 
        else if(parseFloat(aData[2]) <= -75) 
         $("td:eq(2)", nRow).css("background-color", 
          "#00FF00"); 
        else 
         $("td:eq(2)", nRow).css("background-color" 
         , "#FFFFFF"); 
            }' 
            ) 
         , drawCallback = JS() 
           )) 

     output$2 = DT::renderDataTable(2, server = FALSE, 
       selection = 'single') 
     output$3 = DT::renderDataTable(3, server = FALSE, 
       selection = 'single') 
     output$4 = DT::renderDataTable(4, server = FALSE, 
       selection = 'single') 
     output$5 = DT::renderDataTable(5, server = FALSE, 
      selection = 'single') 
     output$6 = DT::renderDataTable(6, server = FALSE, 
       selection = 'single') 
+1

어떤 종류의 문제가 발생했는지 자세히 설명해주십시오. 귀하의 진술 "나는 조건부로 모든 6 테이블을 포맷 할 수 없습니다"너무 막연한입니다. – Omni

+0

이 코드를 실행하면 2 열의 조건부 서식을 지정하기 위해 출력 1에 대해 작동합니다. 출력 2 달러에 동일한 코드를 추가하려고해도 아무 것도 변경되지 않습니다. $ 1 출력은 조건부로 열 2에 서식을 유지하지만 출력 $ 2에는 조건부 서식이 없습니다. 조건부로 2 열의 모든 6 데이터 프레임을 포맷해야합니다. 도움을 주셔서 감사합니다. – mrklkr

+0

우선 DataTable Id의 이름을 숫자로 지정하면 안됩니다. Table1, Table2 ... –

답변

1

내가 가진 귀하의 코드를 시도하고 나를 위해 잘 작동, 아래와 있습니다

library(shiny) 
library(DT) 
ui <- fluidPage(
    titlePanel("xxx"), 
    title = 'xx', 
    fluidRow(
    column(12 
      , fluidRow(
      column(6, DT::dataTableOutput('Table1'), style = "font-size: 
        75%; width: 50%"), 
      column(6, DT::dataTableOutput('Table2'), style = "font-size: 
        75%; width: 50%") 
      ), 
      # hr(), 
      fluidRow(
      column(6, DT::dataTableOutput('Table3'), style = "font-size: 
        75%; width: 50%"), 
      column(6, DT::dataTableOutput('Table4'), style = "font-size: 
        75%; width: 50%") 
      ), 
      # hr(), 
      fluidRow(
      column(6, DT::dataTableOutput('Table5'), style = "font-size: 
        75%; width: 50%"), 
      column(6, DT::dataTableOutput('Table6'), style = "font-size: 
        75%; width: 50%") 
      ) 
      ))) 
    server <- function(input, output) { 
     output$Table1 = DT::renderDataTable(mtcars 
            , server = FALSE, selection = 'single' 
            , options = list(rowCallback = JS('function(nRow 
                     , aData, iDisplayIndex, iDisplayIndexFull) { 
                     // Bold and green cells for conditions 
                     if (parseFloat(aData[2]) 
                     >= 1 | parseFloat(aData[2]) <= 3) 
                     $("td:eq(2)", nRow).css("font-weight", "bold"); 
                     if (parseFloat(aData[2]) >= 1) 
                     $("td:eq(2)", nRow).css("background-color" 
                     , "#FF0000"); 
                     else if(parseFloat(aData[2]) <= 3) 
                     $("td:eq(2)", nRow).css("background-color", 
                     "#00FF00"); 
                     else 
                     $("td:eq(2)", nRow).css("background-color" 
                     , "#FFFFFF"); 
                     }' 
            ))) 

     output$Table2 = DT::renderDataTable(iris, server = FALSE, 
            selection = 'single', options = list(rowCallback = JS('function(nRow 
                     , aData, iDisplayIndex, iDisplayIndexFull) { 
                          // Bold and green cells for conditions 
                          if (parseFloat(aData[2]) 
                          >= 1 | parseFloat(aData[2]) <= 3) 
                          $("td:eq(2)", nRow).css("font-weight", "bold"); 
                          if (parseFloat(aData[2]) >= 1) 
                          $("td:eq(2)", nRow).css("background-color" 
                          , "#FF0000"); 
                          else if(parseFloat(aData[2]) <= 3) 
                          $("td:eq(2)", nRow).css("background-color", 
                          "#00FF00"); 
                          else 
                          $("td:eq(2)", nRow).css("background-color" 
                          , "#FFFFFF"); 
    }' 
            ))) 
     output$Table3 = DT::renderDataTable(iris, server = FALSE, 
            selection = 'single', options = list(rowCallback = JS('function(nRow 
                     , aData, iDisplayIndex, iDisplayIndexFull) { 
                          // Bold and green cells for conditions 
                          if (parseFloat(aData[2]) 
                          >= 1 | parseFloat(aData[2]) <= 3) 
                          $("td:eq(2)", nRow).css("font-weight", "bold"); 
                          if (parseFloat(aData[2]) >= 1) 
                          $("td:eq(2)", nRow).css("background-color" 
                          , "#FF0000"); 
                          else if(parseFloat(aData[2]) <= 3) 
                          $("td:eq(2)", nRow).css("background-color", 
                          "#00FF00"); 
                          else 
                          $("td:eq(2)", nRow).css("background-color" 
                          , "#FFFFFF"); 
    }' 
            ))) 
     output$Table4 = DT::renderDataTable(iris, server = FALSE, 
            selection = 'single', options = list(rowCallback = JS('function(nRow 
                     , aData, iDisplayIndex, iDisplayIndexFull) { 
                     // Bold and green cells for conditions 
                     if (parseFloat(aData[2]) 
                     >= 1 | parseFloat(aData[2]) <= 3) 
                     $("td:eq(2)", nRow).css("font-weight", "bold"); 
                     if (parseFloat(aData[2]) >= 1) 
                     $("td:eq(2)", nRow).css("background-color" 
                     , "#FF0000"); 
                     else if(parseFloat(aData[2]) <= 3) 
                     $("td:eq(2)", nRow).css("background-color", 
                     "#00FF00"); 
                     else 
                     $("td:eq(2)", nRow).css("background-color" 
                     , "#FFFFFF"); 
                     }' 
            ))) 
     output$Table5 = DT::renderDataTable(iris, server = FALSE, 
            selection = 'single', options = list(rowCallback = JS('function(nRow 
                     , aData, iDisplayIndex, iDisplayIndexFull) { 
                          // Bold and green cells for conditions 
                          if (parseFloat(aData[2]) 
                          >= 1 | parseFloat(aData[2]) <= 3) 
                          $("td:eq(2)", nRow).css("font-weight", "bold"); 
                          if (parseFloat(aData[2]) >= 1) 
                          $("td:eq(2)", nRow).css("background-color" 
                          , "#FF0000"); 
                          else if(parseFloat(aData[2]) <= 3) 
                          $("td:eq(2)", nRow).css("background-color", 
                          "#00FF00"); 
                          else 
                          $("td:eq(2)", nRow).css("background-color" 
                          , "#FFFFFF"); 
    }' 
            ))) 
     output$Table6 = DT::renderDataTable(iris, server = FALSE, 
            selection = 'single', options = list(rowCallback = JS('function(nRow 
                     , aData, iDisplayIndex, iDisplayIndexFull) { 
                          // Bold and green cells for conditions 
                          if (parseFloat(aData[2]) 
                          >= 1 | parseFloat(aData[2]) <= 3) 
                          $("td:eq(2)", nRow).css("font-weight", "bold"); 
                          if (parseFloat(aData[2]) >= 1) 
                          $("td:eq(2)", nRow).css("background-color" 
                          , "#FF0000"); 
                          else if(parseFloat(aData[2]) <= 3) 
                          $("td:eq(2)", nRow).css("background-color", 
                          "#00FF00"); 
                          else 
                          $("td:eq(2)", nRow).css("background-color" 
                          , "#FFFFFF"); 
    }' 
            )))} 
shinyApp(ui, server) 

모든 표는 당신이 원하는대로 열이 강조되었다.

-> 난 그냥, DataTable의 ID를 변경 DT 라이브러리를 읽고 브래킷을 수정했다.

귀하의 경우에는 JS없이 formatStyle()의 도움없이 전체 열의 형식을 지정하는 것이 좋습니다.

reproducible example 다음 번 게시물을 보내주십시오.

formatStyle와 [업데이트] 솔루션()

당신은 formatStyle() 옵션을 사용하여 솔루션을 볼 수 아래 코드에 대한 설명은 다음 특정 라인에 있습니다.

library(shiny) 
library(DT) 
ui <- fluidPage(
    titlePanel("xxx"), 
    title = 'xx', 
    fluidRow(
    column(12 
      , fluidRow(
      column(6, DT::dataTableOutput('Table1'), style = "font-size: 
        75%; width: 50%"), 
      column(6, DT::dataTableOutput('Table2'), style = "font-size: 
        75%; width: 50%") 
      ), 
      # hr(), 
      fluidRow(
      column(6, DT::dataTableOutput('Table3'), style = "font-size: 
        75%; width: 50%"), 
      column(6, DT::dataTableOutput('Table4'), style = "font-size: 
        75%; width: 50%") 
      ), 
      # hr(), 
      fluidRow(
      column(6, DT::dataTableOutput('Table5'), style = "font-size: 
        75%; width: 50%"), 
      column(6, DT::dataTableOutput('Table6'), style = "font-size: 
        75%; width: 50%") 
      ) 
      ))) 
server <- function(input, output) { 
    output$Table1 = DT::renderDataTable(
    datatable(mtcars) %>% 
     formatStyle('cyl', fontWeight = styleInterval(4, c('normal', 'bold')), # Font bold if cyl > 4 
        backgroundColor = styleInterval(4, c('green', 'red'))) # Red background if cyl > 4 
) 

} 
shinyApp(ui, server) 
+0

정말 고마워요. formatStyle()을 사용하고 싶습니다. 제대로 작동하지 않습니다. 어떤 제안이라도 도움이 될 것입니다. 고맙습니다! – mrklkr

+0

내 코드는 이제 작동하지만 형식 스타일을 사용하고 싶습니다. 또한 음모를 만들고 싶다면 6 개의 데이터 표 중 하나를 "클릭"하면 음모가 표시됩니다. – mrklkr

+0

내 답변 업데이트를 확인하십시오. –