r - R 闪亮:如何在数据表中包含“导出到 LaTeX”按钮?
问题描述
我有一个带有数据表的 Shiny 应用程序。我想在这个数据表的顶部(但在它的标题下面)实现一个按钮,这样当我点击它时,构建这个表所需的 LaTeX 代码就会被复制到剪贴板。
基本上,此按钮的工作方式与“复制”或“csv”按钮(参见此处的第 2 部分)相同,但使用的是 LaTeX 代码。
这是一个可重现的示例:
library(DT)
library(shiny)
library(shinydashboard)
library(data.table)
library(stargazer)
library(clipr)
ui <- dashboardPage(
dashboardHeader(title = "test with mtcars", titleWidth = 1000),
dashboardSidebar(
selectizeInput("var.cor", label = "Correlation",
choices = names(mtcars),
selected = c("mpg", "cyl"),
multiple = TRUE)
),
dashboardBody(
tabsetPanel(
tabPanel("test with mtcars",
br(),
box(dataTableOutput("cor"),
width = NULL),
actionButton("copy.latex", label = "Copy to LaTeX")
)
)
)
)
server <- function(input, output) {
var.selected <- reactive({
out <- input$var.cor
out
})
user.selection <- reactive({
mtcars <- mtcars[, var.selected()]
})
output$cor <- renderDataTable({
dtable <- user.selection()
tmp <- datatable(cor(dtable),
extensions = 'Buttons',
options = list(
dom = 'Bfrtip',
buttons = list(
"copy",
list(
extend = "collection",
text = 'test',
action = DT::JS("function ( e, dt, node, config ) {
Shiny.setInputValue('test', true, {priority: 'event'});
}")
)
)
)
)
observeEvent(input$test, {
write_clip(stargazer(tmp),
object_type = "auto")
})
tmp
})
observeEvent(input$copy.latex, {
write_clip(stargazer(input$cor),
object_type = "character")
})
}
shinyApp(ui, server)
我在这段代码中测试了两件事:
首先,我从这里得到启发。这是
observeEvent
嵌套在的代码renderDataTable
。但是,剪贴板中的文本要么是% Error: Unrecognized object type
,要么我有一个错误:Error in : Clipboard on X11 requires that the DISPLAY envvar be configured.
其次,我在数据表之外创建了一个按钮,但它不起作用,因为我有
Error in : $ operator is invalid for atomic vectors
有人知道怎么做吗?
解决方案
要将数据框复制到服务器中的剪贴板:
library(shiny)
library(shinyjs)
library(DT)
table <- iris[1:10,]
ui <- fluidPage(
useShinyjs(),
actionButton("latex","Copy Latex to Clipboard"),
DT::dataTableOutput("table")
)
server <- function(input, output, session) {
output$table <- DT::renderDT(table)
observeEvent(input$latex,{
writeClipboard(paste0(capture.output(xtable(table))[-c(1:2)],collapse = "\n"))
shinyjs::alert("table copied to latex")
})
}
shinyApp(ui, server)
我不建议您使用 DT 的按钮来执行此操作。为了使用 DT 做到这一点,至少有 3 个步骤:
- 通过在数据表的 UI 中编写 Javascript 来读取整个表
action
,用于Shiny.setInputValue
将值从 UI 发送到服务器。 - 使用 R 将列表(json)解析为数据框。
- 将数据帧转换为乳胶字符串。
使用数据表的源数据进行转换要容易得多。
推荐阅读
- c# - 如何修复 OrganizationServiceProxy “System.ArgumentNullException:值不能为空。参数名称:identityProvider”问题
- c# - 如何使用存储在 ObservableCollection 中的值向数据库添加新行?
- jmeter - Taurus - 覆盖测试端点中的 jmeter 属性
- css - 为什么当我删除 div 的相对位置时,div 的 box-shadow 会消失?
- chocolatey - 修复 Chocolatey “访问被拒绝”
- android - 基于 Https 的 SOAP 请求在 Android 8|9 中有效,但在 Andorid 5|6 中无效
- pdf - 发生字体错误时 GhostScript 创建额外页面
- gml - 如何修复 GameMaker Studio 2 中的“image_xscale”错误?
- python - 将python中的类实例化为可调用对象
- python - 删除 matplotlib 子图中的默认轴标签