によって作成されたテーブルを使用するRStudioの光沢のあるアプリケーションで、renderTable()
ラジオボタンの先頭の列(もちろんリアクティブ)を追加し、選択した行のスタイルを変更したいと思います。最善の戦略は何ですか?どうしても必要な場合はjQueryを使用できると思いますが、もっと簡単な方法はありませんか?式args内のテーブルセルにhtmlを挿入しようとしましたrenderTable()
...機能しません。
2 に答える
あなたがまだこれについての答えを探しているかどうかわからない。おそらくそうではないでしょうが、それが答えられないのを見るのは私を悲しくさせます。自分でテーブルhtmlを作成し、を使用しますrenderText()
。
例として、一番上の行にラジオボタンがあるページにこのデータフレームが必要だとします。
df <- data.frame(A=1:5, B=1:5)
まずdf
、HTMLテーブルに変換する必要があります。HTMLテーブルのセルと行を作成する関数は次のとおりです。
cell_html <- function(table_cell) paste0('<td>', table_cell, '</td>')
row_html <- function(table_row) {
cells <- sapply(table_row, cell_html)
collapse_cells <- paste0(cells, collapse='')
paste0('<tr>', collapse_cells, '</tr>')
}
そしてそれらの機能を使用する:
df_rows <- apply(df, 1, row_html)
ラジオボタンを作成するためのばかげた小さな関数を次に示します。
radio_html <- function(radio_name, radio_value, radio_text) {
paste0('<input type="radio" name="',
radio_name, '" value="', radio_value, '">', radio_text)
}
の列と同じ数のラジオボタンを作成しましょうdf
:
radios <- sapply(seq_along(df),
function(x) radio_html(paste0('row', x), x, paste(x)))
これにより、次の形式のHTMLが生成されます。
<input type="radio" name="row1" value="1">1
行ごとに。次に、それらからHTMLテーブル行を作成するためにスローインradios
します。row_html
radio_row <- row_html(radios)
次に、ラジオボタンを組み合わせてdf
、すべてをHTMLテーブルタグでラップする必要があります。
table_cells <- c(radio_row, df_rows)
collapse_cells <- paste0(table_cells, collapse='')
full_table <- paste0('<table>', collapse_cells, '</table>')
この獣全体をrenderText()
関数に入れてください。ui.R
または独自のカスタムHTMLインターフェイスを使用しているかどうかはわかりません。私はいつも後者をします、それはあなたにもっと多くの自由を与えます。私は私のページにこれを持っているでしょう:
<div name="x" id="x" class="shiny-html-output"></div>
テーブルをにレンダリングしますoutput$x
。選択した行のスタイルを設定するには、jQueryを使用することをお勧めします。(非常にテストされていない)[編集:以下のコメントで提案された修正を参照]の線に沿った単純なイベント:
$('table input:radio').change(function() {
var index = $('#table input:radio').index(this);
// Add one to skip radio button row.
$('table tr').eq(index + 1).css('background-color', 'blue');
// Also handle reset on other rows
// ...
// ...
});
または、CSSを使用して、テーブルと「選択された」クラスをサーバー側の適切なテーブル行にビルドして、スタイルを設定することもできます。
サンプルデータがない場合、これらはすべてテストされていないため、いくつかのエラーが発生する可能性があります。
ui.R
また、独自のカスタムHTMLではなく使用に満足している場合でも、このメソッドは機能するはずです。そのルートをさまよっているように見えるので、カスタムHTMLを使用することをお勧めします。
私はあなたが尋ねたことに答えていました...すなわち、ラジオボタンの先頭の列を作ること。私はおそらくそれを自分でやらないでしょう。テーブルを通常どおりにrenderTable()
作成し、ラジオボタンを個別に追加してみませんか。つまり、テーブルの一部ではありません。ヘルプについては、Shinyチュートリアルのこのページを参照してください。ラジオボタンをテーブルの列に並べる必要がある場合は、CSSを使用してこれを実現できます。
@MadScone の優れたアドバイスを追求して、次のコードを思いつきました。これは、次の決定的な解決策
です。それを機能させるいくつかの追加機能は次のとおりです。同じラジオ グループ * テーブル ヘッダー行が適切にフォーマットされている * ラジオ ボタンで選択された行は、jQuery を必要とせずに特別なフォーマットを受け取ります。
values = reactiveValues(PopRow=1) ### To receive and hold the selected row number.
f.objects_table_for_OneCT = function(){
f.changeSelectedRow() #### See definition below.
df = createObjectsTable() #### Any data frame goes here; code not provided here.
selectedRow = values$PopRow
header_html <- function(table_cell) paste0('<th>', table_cell, '</th>')
cell_html <- function(table_cell) paste0('<td>', table_cell, '</td>')
radio_html <- function(radio_name, radio_value, is_checked, radio_text) {
paste0('<input type="radio" name="',
radio_name, '" value=', radio_value,
ifelse(is_checked, " checked ", ""),
'>', radio_text)
}
row_html <- function(table_row_num) {
table_row = df[table_row_num, ]
cells <- sapply(table_row, cell_html)
cells <- c(cell_html(radio_html(
"whichRow", table_row_num, table_row_num == selectedRow, "")),
cells)
collapse_cells <- paste0(cells, collapse='')
selectedRowStyle = "style='color:red; font-weight:bold'"
collapse_cells <- paste0('<tr ',
ifelse(table_row_num == selectedRow, selectedRowStyle, ""),
'>', collapse_cells, '</tr>')
collapse_cells
}
df_rows <- sapply(1:nrow(df), row_html)
df_header_row <- header_html(c("CHOICE", names(df)))
collapse_cells <- paste0(c(df_header_row, df_rows), collapse='')
full_table <- paste0('<table class=\"data table table-bordered table-condensed\">',
collapse_cells, '</table>')
return(full_table)
}
output$objects_table_for_OneCT = renderText({f.objects_table_for_OneCT()})
(最後の行に関しては、習慣的にexpr
arg を関数にラップしているので、できdebug
ます。これまでのところ、問題なく動作しています。)
ラジオボタンに応答する関数は次のとおりです。
f.changeSelectedRow = reactive({
if(is.null(values$PopRow)) values$PopRow = 1
if(!is.null(input$whichRow)) ### from the radio button set.
if(input$whichRow != values$PopRow) values$PopRow = input$whichRow
})