数据表显示 empy selectInput,而默认选择值
Datatable displays empy selectInput while values are selected by default
我有下面这个闪亮的应用程序,我在其中传递了一个列表的值,其中的字符在 selectImput()
中,但是虽然所有这些值似乎都是通过检查它们在第三列选择输入似乎是空的。我认为这个问题是由我创建的列表 words
负责的。
library(shiny)
library(DT)
library(jsonlite)
selector <- function(id, values, items = values){
options <- HTML(paste0(mapply(
function(value, item){
as.character(tags$option(value = value, item))
}, c("", values), c("", items)
), collapse = ""))
as.character(
tags$select(
id = id, class = "form-control", multiple = "multiple", options
)
)
}
name<-c("Jack","Bob","Jack","Bob")
item<-c("apple","olive","banana","tomato")
d<-data.frame(name,item,stringsAsFactors = FALSE)
words<-tapply(d$item, d$name, I)
nrows <- length(words)
js <- c(
"function(settings) {",
sprintf("var nrows = %d;", nrows),
sprintf("var words = %s;", toJSON(words)),
" var table = this.api().table();",
" function selectize(i) {",
" $('#slct' + i).selectize({",
" items: words[i-1],",
" onChange: function(value) {",
" table.cell(i-1, 2).data(value.length);",
" }",
" });",
" }",
" for(var i = 1; i <= nrows; i++) {",
" selectize(i);",
" Shiny.setInputValue('slct' + i, words[i-1]);",
" }",
"}"
)
ui <- fluidPage(
br(),
DTOutput("table"),
div( # this is a hidden selectize input whose role is to make
# available 'selectize.js'
style = "display: none;",
selectInput("id", "label", c("x", "y"))
)
)
server <- function(input, output, session) {
output[["table"]] <- renderDT({
dat <- data.frame(
FOO = c(unique(d$name)),
Words = vapply(
1:nrows,
function(i){
selector(paste0("slct", i), words[[i]])
},
character(1)
),
Count = lengths(words),
stringsAsFactors = FALSE
)
datatable(
data = dat,
selection = "none",
escape = FALSE,
rownames = FALSE,
options = list(
initComplete = JS(js),
preDrawCallback = JS(
'function() { Shiny.unbindAll(this.api().table().node()); }'
),
drawCallback = JS(
'function() { Shiny.bindAll(this.api().table().node()); }'
)
)
)
}, server = FALSE)
}
shinyApp(ui, server)
words
列表被命名为:
> name <- c("Jack","Bob","Jack","Bob")
> item <- c("apple","olive","banana","tomato")
> d <- data.frame(name, item)
>
> ( words <- tapply(d$item, d$name, I) )
$Bob
[1] olive tomato
Levels: apple banana olive tomato
$Jack
[1] apple banana
Levels: apple banana olive tomato
因此它的JSON表示是:
> toJSON(words)
{"Bob":["olive","tomato"],"Jack":["apple","banana"]}
这不是数组。删除名称,您将获得想要的数组数组:
> toJSON(unname(words))
[["olive","tomato"],["apple","banana"]]
或者不使用 'jsonlite',而是使用基本的 JSON 字符串化器:
sprintf("[%s]", toString(vapply(words, function(x){
sprintf("[%s]", toString(shQuote(x)))
}, character(1))))
# "[['olive', 'tomato'], ['apple', 'banana']]"
我有下面这个闪亮的应用程序,我在其中传递了一个列表的值,其中的字符在 selectImput()
中,但是虽然所有这些值似乎都是通过检查它们在第三列选择输入似乎是空的。我认为这个问题是由我创建的列表 words
负责的。
library(shiny)
library(DT)
library(jsonlite)
selector <- function(id, values, items = values){
options <- HTML(paste0(mapply(
function(value, item){
as.character(tags$option(value = value, item))
}, c("", values), c("", items)
), collapse = ""))
as.character(
tags$select(
id = id, class = "form-control", multiple = "multiple", options
)
)
}
name<-c("Jack","Bob","Jack","Bob")
item<-c("apple","olive","banana","tomato")
d<-data.frame(name,item,stringsAsFactors = FALSE)
words<-tapply(d$item, d$name, I)
nrows <- length(words)
js <- c(
"function(settings) {",
sprintf("var nrows = %d;", nrows),
sprintf("var words = %s;", toJSON(words)),
" var table = this.api().table();",
" function selectize(i) {",
" $('#slct' + i).selectize({",
" items: words[i-1],",
" onChange: function(value) {",
" table.cell(i-1, 2).data(value.length);",
" }",
" });",
" }",
" for(var i = 1; i <= nrows; i++) {",
" selectize(i);",
" Shiny.setInputValue('slct' + i, words[i-1]);",
" }",
"}"
)
ui <- fluidPage(
br(),
DTOutput("table"),
div( # this is a hidden selectize input whose role is to make
# available 'selectize.js'
style = "display: none;",
selectInput("id", "label", c("x", "y"))
)
)
server <- function(input, output, session) {
output[["table"]] <- renderDT({
dat <- data.frame(
FOO = c(unique(d$name)),
Words = vapply(
1:nrows,
function(i){
selector(paste0("slct", i), words[[i]])
},
character(1)
),
Count = lengths(words),
stringsAsFactors = FALSE
)
datatable(
data = dat,
selection = "none",
escape = FALSE,
rownames = FALSE,
options = list(
initComplete = JS(js),
preDrawCallback = JS(
'function() { Shiny.unbindAll(this.api().table().node()); }'
),
drawCallback = JS(
'function() { Shiny.bindAll(this.api().table().node()); }'
)
)
)
}, server = FALSE)
}
shinyApp(ui, server)
words
列表被命名为:
> name <- c("Jack","Bob","Jack","Bob")
> item <- c("apple","olive","banana","tomato")
> d <- data.frame(name, item)
>
> ( words <- tapply(d$item, d$name, I) )
$Bob
[1] olive tomato
Levels: apple banana olive tomato
$Jack
[1] apple banana
Levels: apple banana olive tomato
因此它的JSON表示是:
> toJSON(words)
{"Bob":["olive","tomato"],"Jack":["apple","banana"]}
这不是数组。删除名称,您将获得想要的数组数组:
> toJSON(unname(words))
[["olive","tomato"],["apple","banana"]]
或者不使用 'jsonlite',而是使用基本的 JSON 字符串化器:
sprintf("[%s]", toString(vapply(words, function(x){
sprintf("[%s]", toString(shQuote(x)))
}, character(1))))
# "[['olive', 'tomato'], ['apple', 'banana']]"