根据 URL 数据具有“&”字符的应用程序加载时预填充闪亮输入
Prepopulate Shiny inputs when an app loads based on URL where data has "&" character
我需要在基于 URL 参数加载应用程序时预填充 Shiny 输入。下面link中的代码可以正常运行:
https://github.com/daattali/advanced-shiny/tree/master/url-inputs.
但是,我的数据在每个数据中都有“&”字符。此代码还在 URL 中的每个输入之间使用“&”字符。如何处理这个冲突?
示例输入:NAME&SURNAME。
作为解决方法,您可以考虑根据需要覆盖 parseQueryString()
函数。例如,将 url 中值的分隔符从 &
更改为 &&
。
parseQueryString <- function (str, nested = FALSE, seperator = "&&")
{
if (is.null(str) || nchar(str) == 0)
return(list())
if (substr(str, 1, 1) == "?")
str <- substr(str, 2, nchar(str))
pairs <- strsplit(str, seperator, fixed = TRUE)[[1]]
pairs <- pairs[pairs != ""]
pairs <- strsplit(pairs, "=", fixed = TRUE)
keys <- vapply(pairs, function(x) x[1], FUN.VALUE = character(1))
values <- vapply(pairs, function(x) x[2], FUN.VALUE = character(1))
values[is.na(values)] <- ""
keys <- gsub("+", " ", keys, fixed = TRUE)
values <- gsub("+", " ", values, fixed = TRUE)
keys <- URLdecode(keys)
values <- URLdecode(values)
res <- stats::setNames(as.list(values), keys)
if (!nested)
return(res)
for (i in grep("\[.+\]", keys)) {
k <- strsplit(keys[i], "[][]")[[1L]]
res <- assignNestedList(res, k[k != ""], values[i])
res[[keys[i]]] <- NULL
}
res
}
那会产生:
代码:
library(shiny)
ui <- fluidPage(
textInput("name", "Name"),
numericInput("age", "Age", 25)
)
server <- function(input, output, session) {
observe({
query <- parseQueryString(session$clientData$url_search)
print(query)
if (!is.null(query[['name']])) {
updateTextInput(session, "name", value = query[['name']])
}
if (!is.null(query[['age']])) {
updateNumericInput(session, "age", value = query[['age']])
}
})
}
shinyApp(ui, server)
我需要在基于 URL 参数加载应用程序时预填充 Shiny 输入。下面link中的代码可以正常运行: https://github.com/daattali/advanced-shiny/tree/master/url-inputs.
但是,我的数据在每个数据中都有“&”字符。此代码还在 URL 中的每个输入之间使用“&”字符。如何处理这个冲突?
示例输入:NAME&SURNAME。
作为解决方法,您可以考虑根据需要覆盖 parseQueryString()
函数。例如,将 url 中值的分隔符从 &
更改为 &&
。
parseQueryString <- function (str, nested = FALSE, seperator = "&&")
{
if (is.null(str) || nchar(str) == 0)
return(list())
if (substr(str, 1, 1) == "?")
str <- substr(str, 2, nchar(str))
pairs <- strsplit(str, seperator, fixed = TRUE)[[1]]
pairs <- pairs[pairs != ""]
pairs <- strsplit(pairs, "=", fixed = TRUE)
keys <- vapply(pairs, function(x) x[1], FUN.VALUE = character(1))
values <- vapply(pairs, function(x) x[2], FUN.VALUE = character(1))
values[is.na(values)] <- ""
keys <- gsub("+", " ", keys, fixed = TRUE)
values <- gsub("+", " ", values, fixed = TRUE)
keys <- URLdecode(keys)
values <- URLdecode(values)
res <- stats::setNames(as.list(values), keys)
if (!nested)
return(res)
for (i in grep("\[.+\]", keys)) {
k <- strsplit(keys[i], "[][]")[[1L]]
res <- assignNestedList(res, k[k != ""], values[i])
res[[keys[i]]] <- NULL
}
res
}
那会产生:
代码:
library(shiny)
ui <- fluidPage(
textInput("name", "Name"),
numericInput("age", "Age", 25)
)
server <- function(input, output, session) {
observe({
query <- parseQueryString(session$clientData$url_search)
print(query)
if (!is.null(query[['name']])) {
updateTextInput(session, "name", value = query[['name']])
}
if (!is.null(query[['age']])) {
updateNumericInput(session, "age", value = query[['age']])
}
})
}
shinyApp(ui, server)