2017-12-16 11 views
0

나는 반짝이는 응용 프로그램의 테이블에서 일부 조건부 색상 포맷을 구현하기 위해 formattable을 사용하고 있습니다. 예를 들어, 2, 녹색, 5, 빨간색, 2 ~ 5, 주황색 아래의 셀에 색을 지정한다고 가정 해 보겠습니다. 나는이처럼 내 포매터 기능을 작성합니다포맷 가능한 동적 조건

formatter(
    "span", 
    style = x ~ style(
    color = 'white', 
    'background-color' = 
    ifelse(x > 5, "red", 
     ifelse(x > 2 & x <= 5, "orange", 
     "green")))) 

그러나, 내가 정말하고 싶은 것은, 그 컬러 임계 값을 갖는 즉, 2, 5, 사용자에 의해 변경 될 수 있습니다.

그럼 user_low과 user_high는 사용자가 정의 가정 해 봅시다 :

col_format <- 
    formatter(
     "span", 
     style = x ~ style(
     color = 'white', 
     'background-color' = 
     ifelse(x > input$user_high, "red", 
      ifelse(x > input$user_low & x <= input$user_high, "orange", 
      "green")))) 

지금 내 반짝 응용 프로그램 내에서 Formattable가에이 포매터를 공급하려고하면 : 나는 다음과 같은 오류가

formattable(mtcars, col_format) 

:

'col_format' of mode 'function' was not found 

겉보기 입력 $ user_low 및 입력 $ user_high는 평가되지 않고 기능합니다 tead는 포맷터 내부에서 문자열로 취급됩니다. 나는 eval(), eval (parse())를 시도했지만 아무 소용이 없다.

아이디어가 있으십니까?

+0

확실하지. [여기] (https://cran.r-project.org/web/packages/tableHTML/vignettes/conditional_column.html)를 확인하십시오. 또한 반짝 반짝 빛납니다. – LyzandeR

+0

멋진 @LyzandeR. 나는 tableHTML을 보지 못했습니다. 확실히 좋은 백업입니다. Formattable은 조금 더 멋지게 보이지만 가능하다면 해당 프레임 워크에서 수행하고 싶습니다 – quantumcatz

답변

0

코드는 거의 기능적이지만 표현식에 input$user_high과 같은 입력 요소를 사용하려면 reactive을 사용해야합니다.

이 순서로 일어날 것이다 : 상기 입력 요소

  1. 숫자가 변경. (input$user_low 또는 input$user_high)
  2. 종속성이 변경되어 열 서식 조건 (col_format)이 업데이트됩니다.
  3. dataTableOutputcol_format에 의존하기 때문에 다시 렌더링됩니다.

예제 코드 :

library(shiny) 
library(formattable) 
library(DT) 

ui <- fluidPage(
    sidebarLayout(
    sidebarPanel(
     numericInput("user_low", "User low", value = 2, min = 1, max = 5), 
     numericInput("user_high", "User high", value = 8, min = 6, max = 10) 
    ), 

    mainPanel(
     DT::dataTableOutput("table") 
    ) 
) 
) 

server <- function(input, output) { 
    output$table <- DT::renderDataTable({ 
    as.datatable(formattable(mtcars, list(
     cyl = col_format() 
    ))) 
    }) 

    col_format <- reactive({ 
    formatter(
     "span", 
     style = x ~ style(
     color = 'white', 
     'background-color' = 
      ifelse(x > input$user_high, "red", 
       ifelse(x > input$user_low & x <= input$user_high, "orange", 
         "green")))) 
    }) 

} 

shinyApp(ui, server) 

편집 다음 동적으로 생성 포맷터에서와 같이, 당신은 lapply을 사용할 수 있습니다 (귀하의 코멘트에 따라) 모든 컬럼에 포맷을 적용하려면에서 섹션 Formattable vignette. 아래 코드는 전체 데이터 세트에 서식을 적용합니다.

코드 :`formattable`하지만이 tableHTML``정말 쉬운에 대한

output$table <- DT::renderDataTable({ 
    as.datatable(formattable(mtcars, lapply(1:ncol(mtcars), function(col) { 
    area(row = 1:nrow(mtcars), col) ~ col_format() 
    }))) 
}) 
+0

Ah! 저에게 감사드립니다. 실제로 포맷터를 반응 적으로 넣으려고했는데 작동하지 않았지만 이제는 모든 열 (형식적으로 'cyl'가 아니라 대답)에 포맷터를 적용하려고했기 때문에 실현되었습니다. 나는 아마 그것을 언급 했어야했다. 나는이 질문에 답을 표시 하겠지만, mtcars의 모든 열에 포맷터를 적용하는 방법에 대해 알고 있다면 크게 감사하겠습니다! – quantumcatz

+0

@quantumcatz'formatable '에리스트를 제공해야하기 때문에'lapply'를 사용할 수 있습니다. 자세한 내용은 수정 된 답변을 참조하십시오. – GyD

+0

완벽하게 작동합니다. 감사합니다 .GyD. – quantumcatz