闪亮的数学模式 table
Math mode in shiny table
使用 withMathJax
,我想用行名和一些数学表达式渲染一个 table。这是一个基本示例:
library(shiny)
ui <- fluidPage(
titlePanel("Hello Shiny!"),
mainPanel(withMathJax(),
tableOutput(outputId = "table"))
)
server <- function(input, output) {
output$table <- renderTable({
x <- rnorm(2)
y <- rnorm(2, 1)
tab <- data.frame(x = x, y = y)
withMathJax()
rownames(tab) <- c("\(\alpha\)",
"\(\beta\)")
tab
},
include.rownames = T,
include.colnames = T)
}
shinyApp(ui, server)
不幸的是,这不起作用。我也试过:
rownames(tab) <- c(withMathJax("\(\alpha\)"),
withMathJax("\(\beta\)"))
和
rownames(tab) <- c(paste(withMathJax("\(\alpha\)")),
paste(withMathJax("\(\beta\)")))
但没有任何成功。在后一种情况下,我得到了正确渲染的 alpha 和 beta,但是也有
<script>if (window.MathJax) MathJax.Hub.Queue(["Typeset", MathJax.Hub]);</script>
编辑:
即使在重新呈现 table 的情况下,该方法也应该最好起作用。根据@Stéphane Laurent 的建议,我更新了代码:
library(shiny)
ui <- fluidPage(
titlePanel("Hello Shiny!"),
mainPanel(
numericInput("mean", label = "mean", value = 1),
withMathJax(tableOutput("table"))
)
)
server <- function(input, output) {
output$table <- renderTable({
x <- rnorm(2)
y <- rnorm(2, input$mean)
tab <- data.frame(x = x, y = y)
rownames(tab) <- c("\(\alpha\)",
"\(\beta\)")
tab
},
include.rownames = TRUE,
include.colnames = TRUE)
}
shinyApp(ui, server)
你可以使用xtable
生成LaTeX table:
library(shiny)
library(xtable)
ui <- fluidPage(
titlePanel("Hello Shiny!"),
mainPanel(
uiOutput("table")
)
)
server <- function(input, output) {
output$table <- renderUI({
x <- rnorm(2)
y <- rnorm(2, 1)
tab <- data.frame(x = x, y = y)
rownames(tab) <- c("\alpha",
"\beta")
LaTeXtab <- print(xtable(tab, align=rep("c", ncol(tab)+1)),
floating=FALSE, tabular.environment="array", comment=FALSE,
print.results=FALSE,
sanitize.rownames.function = function(x) x)
tagList(
withMathJax(),
HTML(paste0("$$", LaTeXtab, "$$"))
)
})
}
shinyApp(ui, server)
如果你不想使用xtable
,你可以这样做:
library(shiny)
ui <- fluidPage(
titlePanel("Hello Shiny!"),
mainPanel(
withMathJax(tableOutput("table"))
)
)
server <- function(input, output) {
output$table <- renderTable({
x <- rnorm(2)
y <- rnorm(2, 1)
tab <- data.frame(x = x, y = y)
rownames(tab) <- c("\(\alpha\)",
"\(\beta\)")
tab
},
include.rownames = TRUE,
include.colnames = TRUE)
}
shinyApp(ui, server)
编辑
正如 OP 所指出的,这在 table 重新呈现时不起作用。这是一个可行的解决方案:
ui <- fluidPage(
titlePanel("Hello Shiny!"),
mainPanel(
numericInput("mean", label = "mean", value = 1),
uiOutput("tableUI")
)
)
server <- function(input, output) {
output$table <- renderTable({
x <- rnorm(2)
y <- rnorm(2, input$mean)
tab <- data.frame(x = x, y = y)
rownames(tab) <- c("\(\alpha\)",
"\(\beta\)")
tab
},
include.rownames = TRUE,
include.colnames = TRUE)
output$tableUI <- renderUI({
input$mean # in order to re-render when input$mean changes
tagList(
withMathJax(),
withMathJax(tableOutput("table"))
)
})
}
编辑 2
之前的解决方案可行,但有一些跳跃,而且不方便,因为它需要在 renderUI
中包含响应式依赖项。下面是一个使用 katex 而不是 MathJax 的解决方案。没有跳跃,也没有 renderUI
.
library(shiny)
js <- "
$(document).on('shiny:value', function(event) {
if(event.name === 'table'){
var matches = event.value.match(/(%%+[^%]+%%)/g);
var newvalue = event.value;
for(var i=0; i<matches.length; i++){
var code = '\\' + matches[i].slice(2,-2);
newvalue = newvalue.replace(matches[i], katex.renderToString(code));
}
event.value = newvalue;
}
})
"
ui <- fluidPage(
tags$head(
tags$link(rel="stylesheet", href="https://cdn.jsdelivr.net/npm/katex@0.10.0-beta/dist/katex.min.css", integrity="sha384-9tPv11A+glH/on/wEu99NVwDPwkMQESOocs/ZGXPoIiLE8MU/qkqUcZ3zzL+6DuH", crossorigin="anonymous"),
tags$script(src="https://cdn.jsdelivr.net/npm/katex@0.10.0-beta/dist/katex.min.js", integrity="sha384-U8Vrjwb8fuHMt6ewaCy8uqeUXv4oitYACKdB0VziCerzt011iQ/0TqlSlv8MReCm", crossorigin="anonymous"),
tags$script(HTML(js))
),
titlePanel("Hello Shiny!"),
mainPanel(
numericInput("mean", "Enter mean", value = 1),
tableOutput("table")
)
)
server <- function(input, output) {
output$table <- renderTable({
x <- rnorm(2)
y <- rnorm(2, input$mean)
tab <- data.frame(x = x, y = y, z = c("hello", "%%gamma%%%%delta%%"))
rownames(tab) <- c("%%alpha%%", "%%beta%%")
tab
}, rownames = TRUE)
}
shinyApp(ui, server)
像 %%string%%
这样的每个出现都被 \string
替换,然后在数学中呈现。
使用 withMathJax
,我想用行名和一些数学表达式渲染一个 table。这是一个基本示例:
library(shiny)
ui <- fluidPage(
titlePanel("Hello Shiny!"),
mainPanel(withMathJax(),
tableOutput(outputId = "table"))
)
server <- function(input, output) {
output$table <- renderTable({
x <- rnorm(2)
y <- rnorm(2, 1)
tab <- data.frame(x = x, y = y)
withMathJax()
rownames(tab) <- c("\(\alpha\)",
"\(\beta\)")
tab
},
include.rownames = T,
include.colnames = T)
}
shinyApp(ui, server)
不幸的是,这不起作用。我也试过:
rownames(tab) <- c(withMathJax("\(\alpha\)"),
withMathJax("\(\beta\)"))
和
rownames(tab) <- c(paste(withMathJax("\(\alpha\)")),
paste(withMathJax("\(\beta\)")))
但没有任何成功。在后一种情况下,我得到了正确渲染的 alpha 和 beta,但是也有
<script>if (window.MathJax) MathJax.Hub.Queue(["Typeset", MathJax.Hub]);</script>
编辑:
即使在重新呈现 table 的情况下,该方法也应该最好起作用。根据@Stéphane Laurent 的建议,我更新了代码:
library(shiny)
ui <- fluidPage(
titlePanel("Hello Shiny!"),
mainPanel(
numericInput("mean", label = "mean", value = 1),
withMathJax(tableOutput("table"))
)
)
server <- function(input, output) {
output$table <- renderTable({
x <- rnorm(2)
y <- rnorm(2, input$mean)
tab <- data.frame(x = x, y = y)
rownames(tab) <- c("\(\alpha\)",
"\(\beta\)")
tab
},
include.rownames = TRUE,
include.colnames = TRUE)
}
shinyApp(ui, server)
你可以使用xtable
生成LaTeX table:
library(shiny)
library(xtable)
ui <- fluidPage(
titlePanel("Hello Shiny!"),
mainPanel(
uiOutput("table")
)
)
server <- function(input, output) {
output$table <- renderUI({
x <- rnorm(2)
y <- rnorm(2, 1)
tab <- data.frame(x = x, y = y)
rownames(tab) <- c("\alpha",
"\beta")
LaTeXtab <- print(xtable(tab, align=rep("c", ncol(tab)+1)),
floating=FALSE, tabular.environment="array", comment=FALSE,
print.results=FALSE,
sanitize.rownames.function = function(x) x)
tagList(
withMathJax(),
HTML(paste0("$$", LaTeXtab, "$$"))
)
})
}
shinyApp(ui, server)
如果你不想使用xtable
,你可以这样做:
library(shiny)
ui <- fluidPage(
titlePanel("Hello Shiny!"),
mainPanel(
withMathJax(tableOutput("table"))
)
)
server <- function(input, output) {
output$table <- renderTable({
x <- rnorm(2)
y <- rnorm(2, 1)
tab <- data.frame(x = x, y = y)
rownames(tab) <- c("\(\alpha\)",
"\(\beta\)")
tab
},
include.rownames = TRUE,
include.colnames = TRUE)
}
shinyApp(ui, server)
编辑
正如 OP 所指出的,这在 table 重新呈现时不起作用。这是一个可行的解决方案:
ui <- fluidPage(
titlePanel("Hello Shiny!"),
mainPanel(
numericInput("mean", label = "mean", value = 1),
uiOutput("tableUI")
)
)
server <- function(input, output) {
output$table <- renderTable({
x <- rnorm(2)
y <- rnorm(2, input$mean)
tab <- data.frame(x = x, y = y)
rownames(tab) <- c("\(\alpha\)",
"\(\beta\)")
tab
},
include.rownames = TRUE,
include.colnames = TRUE)
output$tableUI <- renderUI({
input$mean # in order to re-render when input$mean changes
tagList(
withMathJax(),
withMathJax(tableOutput("table"))
)
})
}
编辑 2
之前的解决方案可行,但有一些跳跃,而且不方便,因为它需要在 renderUI
中包含响应式依赖项。下面是一个使用 katex 而不是 MathJax 的解决方案。没有跳跃,也没有 renderUI
.
library(shiny)
js <- "
$(document).on('shiny:value', function(event) {
if(event.name === 'table'){
var matches = event.value.match(/(%%+[^%]+%%)/g);
var newvalue = event.value;
for(var i=0; i<matches.length; i++){
var code = '\\' + matches[i].slice(2,-2);
newvalue = newvalue.replace(matches[i], katex.renderToString(code));
}
event.value = newvalue;
}
})
"
ui <- fluidPage(
tags$head(
tags$link(rel="stylesheet", href="https://cdn.jsdelivr.net/npm/katex@0.10.0-beta/dist/katex.min.css", integrity="sha384-9tPv11A+glH/on/wEu99NVwDPwkMQESOocs/ZGXPoIiLE8MU/qkqUcZ3zzL+6DuH", crossorigin="anonymous"),
tags$script(src="https://cdn.jsdelivr.net/npm/katex@0.10.0-beta/dist/katex.min.js", integrity="sha384-U8Vrjwb8fuHMt6ewaCy8uqeUXv4oitYACKdB0VziCerzt011iQ/0TqlSlv8MReCm", crossorigin="anonymous"),
tags$script(HTML(js))
),
titlePanel("Hello Shiny!"),
mainPanel(
numericInput("mean", "Enter mean", value = 1),
tableOutput("table")
)
)
server <- function(input, output) {
output$table <- renderTable({
x <- rnorm(2)
y <- rnorm(2, input$mean)
tab <- data.frame(x = x, y = y, z = c("hello", "%%gamma%%%%delta%%"))
rownames(tab) <- c("%%alpha%%", "%%beta%%")
tab
}, rownames = TRUE)
}
shinyApp(ui, server)
像 %%string%%
这样的每个出现都被 \string
替换,然后在数学中呈现。