【问题标题】:Add content to .docx via a loop?通过循环将内容添加到 .docx?
【发布时间】:2023-03-09 21:21:01
【问题描述】:

我的目标是将重复的部分添加到 .docx 文件中,通过从数据框中拉取连续部分中的值来更改它们。使用https://cran.r-project.org/web/packages/officer/vignettes/word.html 的示例代码,我已经能够添加一个单独的部分,但我无法弄清楚如何使此代码在循环中工作。

这是一个最小的例子:

 library(officer)
 library(magrittr)

lastRow <- 10

my_doc <- read_docx()  %>%
for(rowNum in 1:lastRow){
  body_add_par("ID: ") %>%
    if(rowNum < lastRow){
      slip_in_text(paste("ID:", rowNum)) %>%
    }else{
      slip_in_text(paste("ID:", rowNum))
}
print(my_doc, target = "sample.docx")

以下是我在控制台中看到的错误消息:

Error: unexpected '}' in:
"      slip_in_text(paste("ID:", rowNum)) %>%
    }"
>       slip_in_text(paste("ID:", rowNum))
Error in x$default_styles : $ operator is invalid for atomic vectors
> }
Error: unexpected '}' in "}"

似乎很明显,问题来自于使用 %>% 运算符连接对 body_add_par 的连续调用,但我还没有找到解决方法。有没有其他人遇到过类似的问题并制定了解决方案?

谢谢。

【问题讨论】:

    标签: r loops add docx officer


    【解决方案1】:

    您可以删除最外层的%&gt;%,并在循环中简单地使用赋值和管道运算符的组合:

    library(officer)
    library(magrittr)
    
    lastRow <- 10
    
    my_doc <- read_docx() 
    for(rowNum in 1:lastRow) {
      my_doc <- my_doc %>% body_add_par("ID: ") %>% slip_in_text(paste("ID:", rowNum))
    }
    
    print(my_doc, target = "sample.docx")  
    

    【讨论】:

      【解决方案2】:

      当然可以使用 for 循环将段落添加到文档中。这是我发现在官员中做项目符号列表的唯一方法。 这段代码对我有用,可以从扇区的元素列表中列出

      if(length(sector_down_list)>0){
          for(this_sector in sector_down_list){
              mydoc<-body_add_par(mydoc,this_sector,style="Bulleted List")
          }
      }
      

      【讨论】:

      • 我可以看到它是如何与 body_add_par() 一起工作的,但我需要的是在段落中进行 slip_in_text(),这在使用 %>% 运算符的循环中不起作用,但我看不到使用该运算符的任何其他方法。感谢您的关注,如果您有一些适用于 slip_in_text() 的内容,我将非常高兴。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 2012-10-29
      • 2020-04-09
      • 1970-01-01
      • 2013-08-03
      相关资源
      最近更新 更多