我在访问单选按钮输入值时遇到麻烦,当它们嵌入在一个数据表在闪亮。我的代码基于这个例子:单选按钮在DT
它访问第一次传递的值,并在下面显示它们,如下面的截图所示:
第一次传递的截图
一旦我改变了一个重新呈现表格的输入,单选按钮的值就不再显示,而是停留在第一次传递的值上。这可以从下面的截图中看到。第二遍截图
在第一次传递之后,输入不再更新以反映单选按钮的选择。原来的输入似乎冻结了,我找不到一种方法来访问当前的按钮值。
提前感谢您的帮助!
下面是上面例子的代码:library(shiny)
library(DT)
library(data.table)
shinyApp(
ui = fluidPage(
title = 'Radio buttons in a table',
selectInput('questions','Pick',c(1,2)),
DT::dataTableOutput('foo'),
verbatimTextOutput('sel')
),
server = function(input, output, session) {
myData = reactiveValues(m = NULL)
temp = month.abb
observeEvent(input$questions,{
m = data.table(
month1 = temp[1:5],
A = '1',
B = '2',
C = '3',
QWE = runif(5)
)
m[, A := sprintf(
'<input type="radio" name="%s" value="%s"/>',
month1, m[, A]
)]
m[, B := sprintf(
'<input type="radio" name="%s" value="%s"/>',
month1, m[, B]
)]
m[, C := sprintf(
'<input type="radio" name="%s" value="%s"/>',
month1, m[, C]
)]
myData$m = m
})
output$foo = DT::renderDataTable({
m = myData$m
print(m)
}
, escape = FALSE, selection = 'none', server = FALSE, rownames=FALSE,
options = list(dom = 't', paging = FALSE, ordering = FALSE),
callback = JS("table.rows().every(function(i, tab, row) {
var $this = $(this.node());
$this.attr('id', this.data()[0]);
$this.addClass('shiny-input-radiogroup');
});
Shiny.unbindAll(table.table().node());
Shiny.bindAll(table.table().node());")
)
output$sel = renderPrint({
str(sapply(month.abb, function(i) input[[i]]))
})
}
)
这是因为您正在重置observeEvent()
内部的m
。如果您在观察者之外定义它,它将按预期工作。试试这个
server = function(input, output, session) {
myData <- reactiveValues(m = NULL)
temp <- month.abb
m <- data.table(
month1 = temp[1:5],
A = '1',
B = '2',
C = '3',
QWE = runif(5)
)
observeEvent(input$questions,{
m[, A := sprintf(
'<input type="radio" name="%s" value="%s"/>',
month1, m[, A]
)]
m[, B := sprintf(
'<input type="radio" name="%s" value="%s"/>',
month1, m[, B]
)]
m[, C := sprintf(
'<input type="radio" name="%s" value="%s"/>',
month1, m[, C]
)]
myData$m = m
})
output$foo = DT::renderDataTable({
m = myData$m
print(m)
}
, escape = FALSE, selection = 'none', server = FALSE, rownames=FALSE, # editable=TRUE,
options = list(dom = 't', paging = FALSE, ordering = FALSE),
callback = JS("table.rows().every(function(i, tab, row) {
var $this = $(this.node());
$this.attr('id', this.data()[0]);
$this.addClass('shiny-input-radiogroup');
});
Shiny.unbindAll(table.table().node());
Shiny.bindAll(table.table().node());")
)
output$sel = renderPrint({
str(sapply(month.abb, function(i) input[[i]]))
})
}