R Shiny selectizeInput 服务器端未正确初始化
R Shiny selectizeInput server side not initializing correctly
当我尝试在 Shiny 应用程序中嵌入选择输入小部件时,我 运行 遇到了以下问题:
使用 server = TRUE
时,项目列表未使用完整的项目列表进行初始化。只有在搜索框中输入一个字符后,项目才会出现。这与 server = FALSE
时的行为相反。在这种情况下,所有项目最初都出现在框中(这是我想要的行为)。我想使用 server = TRUE
选项的原因是我希望能够对项目应用格式,而在客户端生成项目时这是不可能的。下面的示例重现了这种现象,一个选择输入使用 server = TRUE
,另一个选择输入使用 server = FALSE
。在我看来,两种情况下的行为应该相同。
重现问题的示例 app.R:
library(shiny)
server <- function(input, output, session) {
updateSelectizeInput(session, 'cars1', server = TRUE, choices = rownames(mtcars))
updateSelectizeInput(session, 'cars2', server = FALSE, choices = rownames(mtcars))
}
ui <- fluidPage(
selectizeInput('cars1', label = "server side", choices = NULL),
selectizeInput('cars2', label = "client side", choices = NULL)
)
shinyApp(ui = ui, server = server)
这是一个错误还是我使用小部件不正确?我是 运行 R 版本 3.1.3 和 Windows 7 64 位上的 Shiny 0.11.1。
我相信有一个选项可以为 selectize 设置初始化值。它在 options
中为 items
。你必须向它传递一个你想要的值的数组,所以你应该能够只传递它 rownames(mtcars)
它应该可以工作。虽然我从来没有用超过一个值尝试过,所以我不是 100% 肯定。
所以我相信你的命令是
selectizeInput('cars1', label= "server side", choices = NULL, options = list(items = rownames(mtcars))),
然后其他行依此类推。或者,如果这不起作用,请尝试对 items 数组中的初始值进行硬编码。我知道不太好,我不知道你有多少初始值,但我相信它会起作用。
受 Colin 回答的启发,我找到了一个似乎可行的解决方法,尽管我仍然认为这实际上是一个闪亮的错误。首先通过添加参数 selected = rowsnames(mtcars)
选择所有选项,然后再次调用 updateSelectizeInput()
,选择第一项,项目列表将填充所有 choices/items。这也适用于 multiple = TRUE
(因为我想使用它)。
library(shiny)
server <- function(input, output, session) {
updateSelectizeInput(session, 'cars1', server = T, choices = rownames(mtcars), selected = rownames(mtcars))
updateSelectizeInput(session, 'cars1', server = FALSE, selected = rownames(mtcars)[1])
updateSelectizeInput(session, 'cars2', server = FALSE, choices = rownames(mtcars))
}
ui <- fluidPage(
selectizeInput('cars1', label= "server side", choices = NULL, multiple = F),
selectizeInput('cars2', label = "client side", choices = NULL)
)
shinyApp(ui = ui, server = server)
此问题已 fixed in shiny v0.12.0 (on CRAN now)。服务器端 selectizeInput()
最初将加载前 1000 个选项(或 n < 1000
时的前 n
个选项)。
当我尝试在 Shiny 应用程序中嵌入选择输入小部件时,我 运行 遇到了以下问题:
使用 server = TRUE
时,项目列表未使用完整的项目列表进行初始化。只有在搜索框中输入一个字符后,项目才会出现。这与 server = FALSE
时的行为相反。在这种情况下,所有项目最初都出现在框中(这是我想要的行为)。我想使用 server = TRUE
选项的原因是我希望能够对项目应用格式,而在客户端生成项目时这是不可能的。下面的示例重现了这种现象,一个选择输入使用 server = TRUE
,另一个选择输入使用 server = FALSE
。在我看来,两种情况下的行为应该相同。
重现问题的示例 app.R:
library(shiny)
server <- function(input, output, session) {
updateSelectizeInput(session, 'cars1', server = TRUE, choices = rownames(mtcars))
updateSelectizeInput(session, 'cars2', server = FALSE, choices = rownames(mtcars))
}
ui <- fluidPage(
selectizeInput('cars1', label = "server side", choices = NULL),
selectizeInput('cars2', label = "client side", choices = NULL)
)
shinyApp(ui = ui, server = server)
这是一个错误还是我使用小部件不正确?我是 运行 R 版本 3.1.3 和 Windows 7 64 位上的 Shiny 0.11.1。
我相信有一个选项可以为 selectize 设置初始化值。它在 options
中为 items
。你必须向它传递一个你想要的值的数组,所以你应该能够只传递它 rownames(mtcars)
它应该可以工作。虽然我从来没有用超过一个值尝试过,所以我不是 100% 肯定。
所以我相信你的命令是
selectizeInput('cars1', label= "server side", choices = NULL, options = list(items = rownames(mtcars))),
然后其他行依此类推。或者,如果这不起作用,请尝试对 items 数组中的初始值进行硬编码。我知道不太好,我不知道你有多少初始值,但我相信它会起作用。
受 Colin 回答的启发,我找到了一个似乎可行的解决方法,尽管我仍然认为这实际上是一个闪亮的错误。首先通过添加参数 selected = rowsnames(mtcars)
选择所有选项,然后再次调用 updateSelectizeInput()
,选择第一项,项目列表将填充所有 choices/items。这也适用于 multiple = TRUE
(因为我想使用它)。
library(shiny)
server <- function(input, output, session) {
updateSelectizeInput(session, 'cars1', server = T, choices = rownames(mtcars), selected = rownames(mtcars))
updateSelectizeInput(session, 'cars1', server = FALSE, selected = rownames(mtcars)[1])
updateSelectizeInput(session, 'cars2', server = FALSE, choices = rownames(mtcars))
}
ui <- fluidPage(
selectizeInput('cars1', label= "server side", choices = NULL, multiple = F),
selectizeInput('cars2', label = "client side", choices = NULL)
)
shinyApp(ui = ui, server = server)
此问题已 fixed in shiny v0.12.0 (on CRAN now)。服务器端 selectizeInput()
最初将加载前 1000 个选项(或 n < 1000
时的前 n
个选项)。