首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >withMathJax在modalDialog表中

withMathJax在modalDialog表中
EN

Stack Overflow用户
提问于 2022-02-16 08:52:51
回答 1查看 77关注 0票数 2

我试图在表中包含LateX公式,并使用MathJack库这样做。在modalDialog之外,每件事情都运行得很顺利,但是当表在modalDialog中生成时,它并没有像预期的那样显示出来。我猜它必须使用在帮助页面中编写的内容“它只需要在一个应用程序中被调用一次,除非在页面加载之后呈现内容,例如通过renderUI(),在这种情况下,我们必须在每次向输出写入数学表达式时显式地调用它。”但我想不出怎么解决这个问题。

下面是一个重复:

代码语言:javascript
运行
复制
library(shiny)

ui <- shinyUI(
  fluidPage(
    withMathJax(), 
    actionButton("open", "Open")))


server <- function(input, output, session){  
  
  output$mytable <- renderTable({  
    df <- data.frame(A = c(HTML("$$\\alpha+\\beta$$"), "$$\\alpha+\\gamma$$", "$$\\alpha+\\lambda$$"),B = c(111111, 3333333, 3123.233))  
    df  
  }, sanitize.text.function = function(x) x)
  
  
  
  observeEvent(input$open, {
    showModal(modalDialog(
      withMathJax(),
      h2("$$\\mbox{My Math example }\\sqrt{2}$$"),
      tableOutput('mytable')))
  })
}

shinyApp(ui = ui, server = server)
EN

Stack Overflow用户

回答已采纳

发布于 2022-02-17 10:23:23

奇怪的是,它是这样工作的:

代码语言:javascript
运行
复制
  observeEvent(input$open, {
    showModal(withMathJax(modalDialog(
      h2("$$\\mbox{My Math example }\\sqrt{2}$$"),
      withMathJax(tableOutput('mytable')))))
  })

编辑

由于该解决方案存在一些问题,下面是使用KaTeX而不是MathJax的解决方案。

代码语言:javascript
运行
复制
library(shiny)

js <- " 
$(document).on('shiny:value', function(event) {
  if(event.name === 'mytable'){
    // h2 element
    var $h2 = $('#title');
    var title = $h2.html();
    var matches_title = title.match(/(%%+[^%]+%%)/g);
    var i, code;
    for(i=0; i<matches_title.length; i++){
      code = matches_title[i].slice(2,-2);
      title = title.replace(matches_title[i], katex.renderToString(code));
    }
    $h2.html(title);
    $h2.css('visibility', 'visible');
    // table:
    var matches = event.value.match(/(%%+[^%]+%%)/g);
    var newvalue = event.value;
    for(i=0; i<matches.length; i++){
      code = matches[i].slice(2,-2);
      newvalue = newvalue.replace(matches[i], katex.renderToString(code));
    }
    event.value = newvalue;
  }
})
" 

css <- "#mytable td:nth-child(3) {display: none;}"

ui <- fluidPage(
  tags$head(
    tags$link(rel="stylesheet", href="https://cdn.jsdelivr.net/npm/katex@0.15.2/dist/katex.min.css", integrity="sha384-MlJdn/WNKDGXveldHDdyRP1R4CTHr3FeuDNfhsLPYrq2t0UBkUdK2jyTnXPEK1NQ", crossorigin="anonymous"),
    tags$script(defer="", src="https://cdn.jsdelivr.net/npm/katex@0.15.2/dist/katex.min.js", integrity="sha384-VQ8d8WVFw0yHhCk5E8I86oOhv48xLpnDZx5T9GogA/Y84DcCKWXDmSDfn13bzFZY", crossorigin="anonymous"),
    tags$script(HTML(js)),
    tags$style(HTML(css))
  ),
  titlePanel("Hello Shiny!"),
  br(),
  actionButton("open", "Open")
)

server <- function(input, output, session){  
  
  output$mytable <- renderTable({ 
    data.frame(
      A = c("%%\\alpha+\\beta%%", "%%\\alpha+\\gamma%%", "%%\\alpha+\\lambda%%"),
      B = c(111111, 3333333, 3123.233),
      ` ` = rep(input$open, 3),
      check.names = FALSE
    ) 
  }, sanitize.text.function = function(x) x)
  
  
  observeEvent(input$open, {
    showModal(modalDialog(
      h2(
        id = "title", 
        style = "visibility: hidden;", 
        "%%\\boxed{Math}\\sqrt{2}%%"
      ),
      tableOutput("mytable")
    ))
  })
  
}

shinyApp(ui, server)

请注意,我在dataframe中包含了一个反应性列:

代码语言:javascript
运行
复制
` ` = rep(input$open, 3)

这是因为如果我不这样做的话,KaTeX呈现只能工作一次。然后我用一些CSS隐藏这个专栏。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71138708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档