如何在 Rshiny 的长 showNotification 中换行?

M.Q*_*sim 6 r shiny

我正在努力将多行闪亮通知放在页面中间。然而,没有像 \r; 这样直观的换行命令。\n 或者
根本不工作。我想知道有什么解决方法可以解决这个问题?

这是最小的工作示例:

library(shiny)

shinyApp(
  ui = fluidPage(
    tags$head(
      tags$style(HTML(".shiny-notification { position:fixed; top: calc(300px);; left: calc(15px);; }" ))),

    textInput("txt", "Content", "Lorem ipsum dolor sit amet, consectetur adipiscing elit, 
              sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
              Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut 
              aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in 
              voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur 
              sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt 
              mollit anim id est laborum."),

    radioButtons("duration", "Seconds before fading out",
                 choices = c("2", "5", "10", "Never"),
                 inline = TRUE
    ),
    radioButtons("type", "Type",
                 choices = c("default", "message", "warning", "error"),
                 inline = TRUE
    ),
    checkboxInput("close", "Close button?", TRUE),
    actionButton("show", "Show"),
    actionButton("remove", "Remove most recent")
  ),
  server = function(input, output) {
    id <- NULL

    observeEvent(input$show, {
      if (input$duration == "Never")
        duration <- NA
      else 
        duration <- as.numeric(input$duration)

      type <- input$type
      if (is.null(type)) type <- NULL

      id <<- showNotification(
        input$txt,
        duration = duration, 
        closeButton = input$close,
        type = type
      )
    })

    observeEvent(input$remove, {
      removeNotification(id)
    })
  }
)
Run Code Online (Sandbox Code Playgroud)

非常感谢您花时间和精力回答这个问题。

r2e*_*ans 6

我的第一个想法是将其包装在 中HTML(...),类似于:

    HTML(paste(strwrap("Lorem ipsum dolor sit amet, consectetur adipiscing elit, 
              sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
              Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut 
              aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in 
              voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur 
              sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt 
              mollit anim id est laborum."), collapse="<br/>"))
Run Code Online (Sandbox Code Playgroud)

那也没用。所以我查看了来源showNotification:

function (ui, action = NULL, duration = 5, closeButton = TRUE, 
    id = NULL, type = c("default", "message", "warning", "error"), 
    session = getDefaultReactiveDomain()) 
{
    if (is.null(id)) 
        id <- createUniqueId(8)
    res <- processDeps(ui, session)
    actionRes <- processDeps(action, session)
    session$sendNotification("show", list(html = res$html, action = actionRes$html, 
        deps = c(res$deps, actionRes$deps), duration = if (!is.null(duration)) duration * 
            1000, closeButton = closeButton, id = id, type = match.arg(type)))
    id
}
Run Code Online (Sandbox Code Playgroud)

当你调试这个时,你会看到:

> res
$html
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. &lt;br/&gt; Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. &lt;br/&gt; Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

$deps
list()
Run Code Online (Sandbox Code Playgroud)

一个问题(我推断)是它不信任该字符串,因此它对所有内容进行 HTML 编码(我不知道是否或为什么会出现这种情况,尽管我确实建议允许使用用户定义的消息通知内的内容可能是可疑的,与 sql 注入相同)。因此,可以重写该函数,确保文本不会被转义。

showNotification2 <- function (ui, action = NULL, duration = 5, closeButton = TRUE, 
    id = NULL, type = c("default", "message", "warning", "error"), 
    session = shiny:::getDefaultReactiveDomain()) {
    if (is.null(id)) 
        id <- shiny:::createUniqueId(8)
    res <- shiny:::processDeps(HTML(ui), session)
    actionRes <- shiny:::processDeps(action, session)
    session$sendNotification("show", list(html = res$html, action = actionRes$html, 
        deps = c(res$deps, actionRes$deps), duration = if (!is.null(duration)) duration * 
            1000, closeButton = closeButton, id = id, type = match.arg(type)))
    id
}
Run Code Online (Sandbox Code Playgroud)

有几个函数不是由 导出的shiny,因此这绝对会受到 API 更改和所有破坏的影响。或者也许这种行为是一个错误,我在这里的重写将被视为它的新版本。谁知道。

当您使用此函数时,事情就会如您所愿。

在此输入图像描述

有了这个新功能,您实际上不需要HTML(),这可能表明此黑客实现中存在缺陷。

  • 自从 HTML(paste(err_message_vector,collapse = "&lt;br/&gt;")) 为我工作以来就投票了 (5认同)