添加语言选项时,带有单选按钮的 R Shiny DT 中断
R Shiny DT with radio-buttons breaks when adding language option
我正在尝试通过一个闪亮的应用程序开发一种表格,其想法是用户填写有关许多地理位置(法国地区)的特定领域(医疗发展优先级分区)。因此我认为DT是最好的选择。我不想创建列 editable
,因为我希望用户在 4 个特定值之间进行选择(该表单的想法是减少之后要清理的自由文本)。
我开始以易会为例https://yihui.shinyapps.io/DT-radio/
当我为法语用户工作时,我试图添加一个选项来将语言自定义为法语,但整个逻辑都崩溃了,我不知道为什么。
这是一个代表:(只需用 language = list(...
注释该行即可使其工作)。
library(shiny)
library(DT)
shinyApp(
ui = fluidPage(
title = 'Radio buttons in a table',
DT::dataTableOutput('foo'),
verbatimTextOutput('sel')
),
server = function(input, output, session) {
m = matrix(
as.character(1:5), nrow = 12, ncol = 5, byrow = TRUE,
dimnames = list(month.abb, LETTERS[1:5])
)
for (i in seq_len(nrow(m))) {
m[i, ] = sprintf(
'<input type="radio" name="%s" value="%s"/>',
month.abb[i], m[i, ]
)
}
m
output$foo = DT::renderDataTable(
m, escape = FALSE, selection = 'none', server = FALSE,
options = list(dom = 'tirp', paging = FALSE, ordering = FALSE
,language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/French.json')
),
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]]))
})
}
)
这是我的 sessionInfo()
使用 R 3.6.0
sessioninfo::session_info()
- Session info ------------------------------------------------------------------
setting value
version R version 3.6.0 (2019-04-26)
os Windows 10 x64
system x86_64, mingw32
ui RStudio
language (EN)
collate French_France.1252
ctype French_France.1252
tz Europe/Paris
date 2019-06-26
- Packages ----------------------------------------------------------------------
package * version date lib source
assertthat 0.2.1 2019-03-21 [1] CRAN (R 3.6.0)
cli 1.1.0 2019-03-19 [1] CRAN (R 3.6.0)
crayon 1.3.4 2017-09-16 [1] CRAN (R 3.6.0)
crosstalk 1.0.0 2016-12-21 [1] CRAN (R 3.6.0)
digest 0.6.19 2019-05-20 [1] CRAN (R 3.6.0)
DT * 0.7.1 2019-06-26 [1] Github (rstudio/DT@c6fd864)
htmltools 0.3.6 2017-04-28 [1] CRAN (R 3.6.0)
htmlwidgets 1.3 2018-09-30 [1] CRAN (R 3.6.0)
httpuv 1.5.1 2019-04-05 [1] CRAN (R 3.6.0)
jsonlite 1.6 2018-12-07 [1] CRAN (R 3.6.0)
later 0.8.0 2019-02-11 [1] CRAN (R 3.6.0)
magrittr 1.5 2014-11-22 [1] CRAN (R 3.6.0)
mime 0.7 2019-06-11 [1] CRAN (R 3.6.0)
packrat 0.5.0 2018-11-14 [1] CRAN (R 3.6.0)
promises 1.0.1 2018-04-13 [1] CRAN (R 3.6.0)
R6 2.4.0 2019-02-14 [1] CRAN (R 3.6.0)
Rcpp 1.0.1 2019-03-17 [1] CRAN (R 3.6.0)
rlang 0.3.4 2019-04-07 [1] CRAN (R 3.6.0)
rstudioapi 0.10 2019-03-19 [1] CRAN (R 3.6.0)
sessioninfo 1.1.1 2018-11-05 [1] CRAN (R 3.6.0)
shiny * 1.3.2 2019-04-22 [1] CRAN (R 3.6.0)
sourcetools 0.1.7 2018-04-25 [1] CRAN (R 3.6.0)
withr 2.1.2 2018-03-15 [1] CRAN (R 3.6.0)
xtable 1.8-4 2019-04-21 [1] CRAN (R 3.6.0)
yaml 2.2.0 2018-07-25 [1] CRAN (R 3.6.0)
我也尝试过使用 R 3.5.2,但我遇到了保存问题。
当我点击一些单选按钮时,我应该看到:
List of 12
$ Jan: chr "1"
$ Feb: chr "2"
$ Mar: NULL
$ Apr: NULL
$ May: NULL
$ Jun: NULL
$ Jul: NULL
$ Aug: NULL
$ Sep: NULL
$ Oct: NULL
$ Nov: NULL
$ Dec: NULL
而是显示 NULL,我找不到任何明确的错误。
List of 12
$ Jan: NULL
$ Feb: NULL
$ Mar: NULL
$ Apr: NULL
$ May: NULL
$ Jun: NULL
$ Jul: NULL
$ Aug: NULL
$ Sep: NULL
$ Oct: NULL
$ Nov: NULL
$ Dec: NULL
DT 中的语言选项有什么问题?
我无法解释,但这可以通过添加 setTimeout
:
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());
setTimeout(function(){
Shiny.bindAll(table.table().node());
},0);")
编辑
以上对我有用,但我设置了 dom = ftirp
。这不适用于 tirp
。这是另一个解决方案:
output$foo = DT::renderDataTable(
m, escape = FALSE, selection = 'none', server = FALSE,
options = list(dom = 'tirp', paging = FALSE, ordering = FALSE,
initComplete = JS("function(settings,json){
var table = settings.oInstance.api();
Shiny.unbindAll(table.table().node());
Shiny.bindAll(table.table().node());}")
,language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/French.json')
),
callback = JS("table.rows().every(function(i, tab, row) {
var $this = $(this.node());
$this.attr('id', this.data()[0]);
$this.addClass('shiny-input-radiogroup');
});")
)
我正在尝试通过一个闪亮的应用程序开发一种表格,其想法是用户填写有关许多地理位置(法国地区)的特定领域(医疗发展优先级分区)。因此我认为DT是最好的选择。我不想创建列 editable
,因为我希望用户在 4 个特定值之间进行选择(该表单的想法是减少之后要清理的自由文本)。
我开始以易会为例https://yihui.shinyapps.io/DT-radio/ 当我为法语用户工作时,我试图添加一个选项来将语言自定义为法语,但整个逻辑都崩溃了,我不知道为什么。
这是一个代表:(只需用 language = list(...
注释该行即可使其工作)。
library(shiny)
library(DT)
shinyApp(
ui = fluidPage(
title = 'Radio buttons in a table',
DT::dataTableOutput('foo'),
verbatimTextOutput('sel')
),
server = function(input, output, session) {
m = matrix(
as.character(1:5), nrow = 12, ncol = 5, byrow = TRUE,
dimnames = list(month.abb, LETTERS[1:5])
)
for (i in seq_len(nrow(m))) {
m[i, ] = sprintf(
'<input type="radio" name="%s" value="%s"/>',
month.abb[i], m[i, ]
)
}
m
output$foo = DT::renderDataTable(
m, escape = FALSE, selection = 'none', server = FALSE,
options = list(dom = 'tirp', paging = FALSE, ordering = FALSE
,language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/French.json')
),
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]]))
})
}
)
这是我的 sessionInfo()
使用 R 3.6.0
sessioninfo::session_info() - Session info ------------------------------------------------------------------ setting value
version R version 3.6.0 (2019-04-26) os Windows 10 x64
system x86_64, mingw32
ui RStudio
language (EN)
collate French_France.1252
ctype French_France.1252
tz Europe/Paris
date 2019-06-26
- Packages ---------------------------------------------------------------------- package * version date lib source
assertthat 0.2.1 2019-03-21 [1] CRAN (R 3.6.0)
cli 1.1.0 2019-03-19 [1] CRAN (R 3.6.0)
crayon 1.3.4 2017-09-16 [1] CRAN (R 3.6.0)
crosstalk 1.0.0 2016-12-21 [1] CRAN (R 3.6.0)
digest 0.6.19 2019-05-20 [1] CRAN (R 3.6.0)
DT * 0.7.1 2019-06-26 [1] Github (rstudio/DT@c6fd864) htmltools 0.3.6 2017-04-28 [1] CRAN (R 3.6.0)
htmlwidgets 1.3 2018-09-30 [1] CRAN (R 3.6.0)
httpuv 1.5.1 2019-04-05 [1] CRAN (R 3.6.0)
jsonlite 1.6 2018-12-07 [1] CRAN (R 3.6.0)
later 0.8.0 2019-02-11 [1] CRAN (R 3.6.0)
magrittr 1.5 2014-11-22 [1] CRAN (R 3.6.0)
mime 0.7 2019-06-11 [1] CRAN (R 3.6.0)
packrat 0.5.0 2018-11-14 [1] CRAN (R 3.6.0)
promises 1.0.1 2018-04-13 [1] CRAN (R 3.6.0)
R6 2.4.0 2019-02-14 [1] CRAN (R 3.6.0)
Rcpp 1.0.1 2019-03-17 [1] CRAN (R 3.6.0)
rlang 0.3.4 2019-04-07 [1] CRAN (R 3.6.0)
rstudioapi 0.10 2019-03-19 [1] CRAN (R 3.6.0)
sessioninfo 1.1.1 2018-11-05 [1] CRAN (R 3.6.0)
shiny * 1.3.2 2019-04-22 [1] CRAN (R 3.6.0)
sourcetools 0.1.7 2018-04-25 [1] CRAN (R 3.6.0)
withr 2.1.2 2018-03-15 [1] CRAN (R 3.6.0)
xtable 1.8-4 2019-04-21 [1] CRAN (R 3.6.0)
yaml 2.2.0 2018-07-25 [1] CRAN (R 3.6.0)
我也尝试过使用 R 3.5.2,但我遇到了保存问题。
当我点击一些单选按钮时,我应该看到:
List of 12
$ Jan: chr "1"
$ Feb: chr "2"
$ Mar: NULL
$ Apr: NULL
$ May: NULL
$ Jun: NULL
$ Jul: NULL
$ Aug: NULL
$ Sep: NULL
$ Oct: NULL
$ Nov: NULL
$ Dec: NULL
而是显示 NULL,我找不到任何明确的错误。
List of 12
$ Jan: NULL
$ Feb: NULL
$ Mar: NULL
$ Apr: NULL
$ May: NULL
$ Jun: NULL
$ Jul: NULL
$ Aug: NULL
$ Sep: NULL
$ Oct: NULL
$ Nov: NULL
$ Dec: NULL
DT 中的语言选项有什么问题?
我无法解释,但这可以通过添加 setTimeout
:
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());
setTimeout(function(){
Shiny.bindAll(table.table().node());
},0);")
编辑
以上对我有用,但我设置了 dom = ftirp
。这不适用于 tirp
。这是另一个解决方案:
output$foo = DT::renderDataTable(
m, escape = FALSE, selection = 'none', server = FALSE,
options = list(dom = 'tirp', paging = FALSE, ordering = FALSE,
initComplete = JS("function(settings,json){
var table = settings.oInstance.api();
Shiny.unbindAll(table.table().node());
Shiny.bindAll(table.table().node());}")
,language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/French.json')
),
callback = JS("table.rows().every(function(i, tab, row) {
var $this = $(this.node());
$this.attr('id', this.data()[0]);
$this.addClass('shiny-input-radiogroup');
});")
)