5

元の質問

(以下の部分的な解決策を含む更新を参照してください。)

グループごとにさまざまな属性を持つレコード (行) の数をまとめた RMarkdown ドキュメントがあります。集計する前にフィルタリングして、テーブルに含まれるレコードを操作できるようにしたいと考えています。以下に、最小限ですが同様のモックアップを作成しました。

私が望むのは、行を効果的に「コメントまたはコメント解除」するインタラクティブなチェックボックスです

  # filter(weight_class == "Heavy") %>% 

下。

Shiny でこれを実行できることはわかっていますが、結果の HTML ファイルを同僚と直接 (私の場合は共有 Box フォルダーを介して) 共有できるようにする必要があるため、少なくとも今のところ、Shiny ソリューションは実行できません。また、私はDT/の機能を使用することを検討しましたdatatableが、そこに到達する前にフィルタリングを行う必要があることがわかる限り (私は表示されることにオープンですが、私はそれについて間違っています)。

htmltoolshtmlwidgets、 のようなパッケージを見たことがありますが、crosstalkそれらはこれを容易にするように見えますが、まだ十分に慣れておらず、私の目的に合わせて変更するのに十分なオンラインの例を見つけることができないようです.

実際には、フィルタリングできるようにしたい複数の条件と、フィルタリングしたデータから生成したい複数のテーブルとプロットがありますが、以下の最小限の例が実行可能な出発点として役立つことを願っています.

Shiny に頼らずにこのタイプのインタラクティブ性を作成するには、どうすればそのようなチェックボックス (または類似のもの) を追加できますか?

デモ RMarkdown:

---
title: "Table Demo"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)
library(DT)
```

```{r data}
set.seed(42)
df <- tibble(
  group = sample(paste0("Group ", LETTERS[1:4]), 100, replace = T),
  weight_class = sample(c("Heavy", "Light"), 100, replace = T, prob = c(.3, .7)),
  is_ready = sample(c(TRUE, FALSE), 100, replace = T, prob = c(.4, .6))
)
```

```{r table}
df %>% 
  # filter(weight_class == "Heavy") %>% 
  count(group, is_ready) %>% 
  pivot_wider(names_from = "is_ready", values_from = n) %>% 
  rename(Ready = `TRUE`, not_ready = `FALSE`) %>% 
  mutate(Total = Ready + not_ready, Ready_Percentage = Ready/Total) %>% 
  select(group, Ready, Total, Ready_Percentage, -not_ready) %>% 
  datatable() %>% 
  formatPercentage("Ready_Percentage")
```

結果の HTML:

HTML_出力

部分的なソリューションで更新

@ user2554330 の提案から、ほぼ機能するソリューションを入手しました。

---
title: "Table Demo"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)
library(DT)
```

```{r data}
set.seed(42)
df <- tibble(
  group = sample(paste0("Group ", LETTERS[1:4]), 100, replace = T),
  weight_class = sample(c("Heavy", "Light"), 100, replace = T, prob = c(.3, .7)),
  is_ready = sample(c(TRUE, FALSE), 100, replace = T, prob = c(.4, .6))
)
```

```{r solution}
library(reactable)
library(crosstalk)
shared_df <- SharedData$new(df)

shared_df %>% 
  reactable(
    groupBy = "group",
    columns = list(
      is_ready = colDef(aggregate = "frequency")
    )
  ) -> tb

bscols(
  widths = c(2, 10),
  list(filter_checkbox("weight_class", "Weight Class", shared_df, ~weight_class)),
  tb
)
```

残念ながら、フィルタリングは集計には影響しません (スクリーンショットを参照)。

すべてのレコードが選択されたスクリーンショット:

すべてのレコード

重いレコードのみが選択されたスクリーンショット:

重いレコードのみ

フィルタリングはグループ数に影響しますが、is_ready頻度の集計には影響しません。フィルタリングがこの列にも影響を与えると予想され、次のような結果が得られます。

df %>% filter(weight_class == "Heavy") %>% count(group, is_ready)
#> # A tibble: 8 x 3
#>   group   is_ready     n
#>   <chr>   <lgl>    <int>
#> 1 Group A FALSE        8
#> 2 Group A TRUE         1
#> 3 Group B FALSE        7
#> 4 Group B TRUE         3
#> 5 Group C FALSE        4
#> 6 Group C TRUE         1
#> 7 Group D FALSE       11
#> 8 Group D TRUE         2

reprex パッケージ(v1.0.0)により 2021-12-14 に作成

私は何を間違っていますか?

4

1 に答える 1