# the path containing the Rmd file :
wd <- "..."
setwd(wd)
# the folder containing the figures :
fig.path <- paste0(wd, "/figure")
# all png figures :
figures <- list.files(fig.path, pattern=".png", all.files=TRUE)
# (safety) create copies of the original files
dir.create(paste0(fig.path,"_copy"))
for(i in 1:length(figures)){
fig <- paste0(fig.path, "/", figures[i])
file.copy(fig,"figure_copy")
}
# resize all figures
for(i in 1:length(figures)){
fig <- paste0(fig.path, "/", figures[i])
comm <- paste("convert -resize 70%", fig, fig)
shell(comm)
}
# then run pandoc from a command line
# or from the pandoc() function :
library(knitr)
pandoc("MyReport.md", "docx")
4 回答
这是一个使用R脚本中的ImageMagick调整大小的解决方案 . 70%的比例似乎是一个不错的选择 .
有关ImageMagick的
resize
函数的更多信息:www.perturb.org我还想将R markdown转换为html和.docx / .odt,并且数字大小和分辨率都很好 . 到目前为止,我发现最好的方法是明确定义.md文档中图形的分辨率和大小(dpi,fig.width和fig.height选项) . 如果你这样做,你有好的图表可用于发布,odt / docx是好的 . 如果您使用远高于默认72 dpi的dpi,问题是图表在html文件中看起来太大了 . 以下是我用来处理此问题的3种方法(NB我使用带有spin()语法的R脚本):
1)在knitr选项中使用out.extra ='WIDTH =“75%”' . 这将强制html的所有图形占据窗口宽度的75% . 这是一个快速的解决方案,但如果你有不同大小的地块,这不是最佳选择 . (NB我更喜欢用厘米而不是英寸,所以到处都是/2.54)
2)使用out.width和out.height指定图形的大小(以像素为单位)到html文件中 . 我使用常量“sc”将绘图的大小缩小到html输出 . 这是更精确的方法,但问题是,对于每个图形,你必须定义fig.witdth / height和out.width / height,这真的很开心!理想情况下,您应该能够在全局选项中指定例如out.width = 150 * fig.width(其中fig.width从块变为块) . 也许这样的事情是可能的,但我不知道如何 .
请注意,对于这两个解决方案,我认为您无法使用pandoc直接将md文件转换为odt(不包括数字) . 我将md转换为html,然后将html转换为odt(没有尝试过docx) . 类似的东西(如果以前的R脚本是名称“figsize1.R”):
3)简单地编译您的文档两次,一次使用低dpi值(~96)用于html输出,一次用高分辨率(~300)用于odt / docx输出 . 这是我现在的首选方式 . 主要缺点是你必须编译两次,但这对我来说不是一个问题,因为我通常只需要在作业的最后提供odt文件来提供给最终用户 . 我在工作期间使用Rstudio中的html notebook按钮定期编译html .
然后用以下脚本编译2个输出(这里你可以直接将md文件转换为html):
这是我的解决方案:破解由Pandoc转换的docx,因为docx只是一个xml文件包,调整数字大小非常简单 .
以下是从转换后的docx中提取的
word/document.xml
中的图形:因此,用所需的值替换节点
wp:extent
&a:ext
的cx
和cy
属性将执行调整大小的作业 . 以下R代码适用于我 . 最宽的数字将占用变量out.width
指定的整行宽度,其余部分按比例调整大小 .一种简单的方法是在各个块选项中包含比例因子
k
:和全局块选项中的变量
dpi
:然后,您可以在全局环境中编织
Rmd
文件之前设置dpi
和k
的值:或者你可以在
Rmd
文件的一个块中设置它们(例如在第一个块中设置k
) .