如何解决在WordR上打印闪亮的电抗值
我在寻求帮助,请使用WordR在Shiny会话中将响应值打印到docx中。下面显示了我的应用程序的精简版。
docx模板的代码为`r reactive({declared_user()})`
(已预订,并带有MS Word的格式符号)。我不知道如何在SO上显示格式符号或提供docx模板,但这是唯一适用的代码。
我已经尝试了多种方式将r {和{x}}包装在r文件和docx的反应性上下文中,但似乎仍然无法在rprt_out.docx中打印出'slt_input'中的值/用户。
所有打印出来的是... function(){.dependents $ register()if(.invalidated || .running){..stacktraceoff ..(self $ .updateValue())} if(.error){stop(.value)} if (.visible).value else invisible(.value)}
declared_user()
解决方法
这是一个解决方案。我认为有两件事使问题变得复杂:
-
renderInlineCode
从.docx模板中提取R代码,并使用eval
来评估代码。不知何故,它无法使用正确的环境进行评估。因此,我稍微更改了代码,以便您可以将环境作为参数传递给函数。 - 它仍然无法评估闪亮的代码。因此,我直接在docx渲染之前从反应堆中生成了一个普通变量,并在模板中使用了该变量。
library(shiny)
library(WordR)
library(officer)
library(dplyr)
renderInlineCode_2 <- function (docxIn,docxOut,eval_envir = parent.frame(),debug = F)
{
if (debug) {
browser()
}
doc <- officer::read_docx(docxIn)
smm <- officer::docx_summary(doc)
styles <- officer::styles_info(doc)
regx <- "^[ ]*`r[ ](.*)`$"
smm$expr <- ifelse(grepl(regx,smm$text),sub(regx,"\\1",NA)
smm$values <- sapply(smm$expr,FUN = function(x) {
eval(parse(text = x),envir = eval_envir)
})
smm <- smm[!is.na(smm$expr),drop = F]
i <- 3
for (i in seq_len(nrow(smm))) {
stylei <- switch(ifelse(is.na(smm$style_name[i]),"a","b"),a = NULL,b = styles$style_name[styles$style_id ==
paste0(styles$style_id[styles$style_name == smm$style_name[i] &
styles$style_type == "paragraph"],"Char")])
doc <- officer::cursor_reach(doc,keyword = paste0("\\Q",smm$text[i],"\\E")) %>% officer::body_remove() %>%
officer::cursor_backward() %>% officer::slip_in_text(smm$values[i],pos = "after",style = stylei)
}
print(doc,target = docxOut)
return(docxOut)
}
ui <- fluidPage(
selectInput('slt_input','name',choices = c("god",'devil')),actionButton("btn_inline",'inline')
)
server <- function(input,output,session) {
declared_user <- reactive({
input$slt_input
})
observeEvent(input$btn_inline,{
eval_user <- declared_user()
renderInlineCode_2("rprt_tmplt.docx","rprt_out.docx")
})
}
shinyApp(ui,server)
在模板中,使用:
`r eval_user`
修改
仔细考虑一下,我认为在原始renderInlineCode
函数中parent.frame()
的{{1}}是eval
。显然,所需的对象没有包含在renderInlineCode
中。因此,您必须继续使用R的作用域,这在这里无法正常工作。我很高兴得到一些更详尽的解释。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。