2017-12-16 12 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(mtcars, col_format) 

'col_format' of mode 'function' was not found 

入力$ user_lowと入力$ user_highは評価されておらずフォーマッタ内部の文字列として扱われます。私は無駄に、eval()、eval(parse())を試してみました。

アイデア?

+0

'formattable'が、これは' tableHTML'と本当に簡単ですわかりません。 [こちら](https://cran.r-project.org/web/packages/tableHTML/vignettes/conditional_column.html)をチェックしてください。それはまた、光沢があると動作します。 – LyzandeR

+0

ニース@LyzandeR。私はtableHTMLを見たことがない、間違いなく良いバックアップ。 Formattableは少し良く見えますが、可能であればそのフレームワークでやりたいと思います – quantumcatz

答えて

0

コードはほとんど機能しますが、input$user_highなどの入力要素を式に使用する場合は、reactiveを使用する必要があります。

これは、順番に発生します:input要素の

  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。以下のコードは、データセット全体にフォーマットを適用します。

コード:

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

ああ! @GyDをありがとう。実際にはフォーマッタを反応系の中に入れてみましたが、うまくいきませんでしたが、現時点では、すべてのカラムに(フォーマルなフォーマットだけではなく)すべてのカラムにフォーマッタを適用しようとしていたためです。私はおそらくそれを言及していたはずです。私は答えとしてマークするつもりですが、mtcarsのすべてのカラムにフォーマッタを適用する方法を知っていれば、非常に感謝しています! – quantumcatz

+0

@quantumcatzあなたは 'formattable'にリストを提供する必要があるので、' lapply'を使うことができます。詳細については私の編集された答えを見てください。 – GyD

+0

完璧に動作します、ありがとう@GyD。 – quantumcatz

関連する問題