微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在WordR上打印闪亮的电抗值

如何解决在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 举报,一经查实,本站将立刻删除。