【发布时间】:2021-05-16 14:56:06
【问题描述】:
使用闪亮的selectizeInput widget,用户可以输入文本以及从值列表中选择一个值。 R中有没有办法读取文本的当前值?
(已添加)
我应该明确指出,我希望能够阅读用户在做出选择之前输入的文本。正如 zimia 指出的那样,在他做出选择之后,他选择的任何内容的值都可以作为 input$input_id 使用(假设 selectize 输入的 id 为“input_id”)。
【问题讨论】:
使用闪亮的selectizeInput widget,用户可以输入文本以及从值列表中选择一个值。 R中有没有办法读取文本的当前值?
(已添加)
我应该明确指出,我希望能够阅读用户在做出选择之前输入的文本。正如 zimia 指出的那样,在他做出选择之后,他选择的任何内容的值都可以作为 input$input_id 使用(假设 selectize 输入的 id 为“input_id”)。
【问题讨论】:
您可以只使用 input$input_id。见下文
ui <- fluidRow(
selectizeInput("input1","Enter Text",choices=c("A","B") ,options = list(create=TRUE)),
textOutput("output1")
)
server<- function(input, output, session){
output$output1 <- renderText({
req(input$input1)
input$input1
})
}
【讨论】:
textInput。 selectizeInput 将包含在“添加”中。如果您希望在开始时有某个选择,您可以在 textInput() 函数中添加一个值。您能否从 UI 和服务器的角度提供一些关于您实际尝试实现的内容的背景信息,例如输入值将用于什么?
我在想会有一个 R/shiny 级别的解决方案。但我找到了一个使用 javascript 的解决方案。
library(shiny)
js <- '
$(document).on("keyup", function(e) {
minChars = 4;
tag1 = document.activeElement.getAttribute("id");
val1 = document.activeElement.value;
if (tag1 == "input1-selectized") {
if (Math.sign(val1.length +1 - minChars) == 1) {
obj = { "val": val1 };
Shiny.onInputChange("valueEntered", obj);
}
}
});
'
ui <- fluidRow(
tags$script(js),
selectizeInput(
"input1",
"Enter text",
choices = c("A", "B"),
options = list(create = FALSE)),
textOutput("output1")
)
server <- function(input, output, session) {
output$output1 <- renderText({
req(input$valueEntered$val)
input$valueEntered$val
})
}
shinyApp(ui = ui, server = server)
javascript 查找输入到 id 为“input1-selectized”的元素中的文本,如果该值的长度为 4 或更大,则将闪亮的变量“valueEntered”设置为 val = text 的对象。
然后 observeEvent 使用闪亮的变量 input$valueEntered 来设置输出文本。
javascript 中使用 Math.sign 函数而不是 > 的原因,以及嵌套 if 的原因是因为出于某种原因,Shiny 将 > 和 && 等中缀运算符替换为它们的 html 等效项,> 和 &&。
请注意,如果 selectizeInput 小部件的 id 为“input1”,则相应的文本字段的 id 为“input1-selectized”。
【讨论】:
tags$script(HTML(js))解决您遇到的javascript被误解的问题