我在一个包中编写了一个函数,它将接受用户提供的一些数据,并使用这些数据的图表制作一个漂亮的Word文档。但是,虽然函数在工作目录是本地驱动器时工作得很好,但是当驱动器是任何其他驱动器时,它就会失败。这些错误是:
退出png中的第6-9行(skeleton.Rmd)错误(.,res = dpi,unit= " In "):无法启动png()设备附加:警告消息: 1:在dir.create中(dirname(skeleton.Rmd),递归= TRUE):无法创建dir‘\myEmployer.com\data\site’,在png(.,res = dpi,units = " In "):无法打开用于写入3的文件'\myemployer.com\data\sites\myworkingdirectory/figure-docx/myplot-1.png‘:在png中(.,res = dpi,unit= "in"):打开设备失败
我确实有权写到我目前的工作目录。事实上,当我在同一个包中调用一个类似的函数来生成一个表而不是一个图时,它工作得很好。
我认为现在发生的事情是Rmarkdown (针织物)需要临时保存图形的png文件,这样才能把它放在Word文件中,并且它把它保存在没有权限的地方。我可以通过指定带有rmarkdown::render?的东西来绕过这种行为吗?
当我提到多个文件和包的文件结构时,我不知道如何准确地创建一个可重复的示例,但这里是我对所需信息的最佳尝试。下面是该函数的一个示例:
myFun <- function(mydata, filename){
G <- ggplot2::ggplot(mydata, ggplot2::aes(x = A, y = B)) +
ggplot2::geom_point()
OutPath <- dirname(filename)
FileName <- basename(filename)
rmarkdown::render(system.file("rmarkdown/templates/myplot/skeleton/skeleton.Rmd",
package="mypackage"), output_dir = OutPath,
output_file = FileName, quiet = TRUE)
}从包的顶层获取到mypackage/inst/rmarkdown/templates/myplot/skeleton/skeleton.Rmd的文件结构: skeleton.Rmd
实际的R标记文档如下所示:
---
title: "My Plot"
output: word_document
---
```{r}G
错误消息“从第6-9行退出”指的是输出G的块。
要调用这一点,您可以使用:
myFun(mydata = data.frame(A = 1:10, B = 1:10),
filename = "my file.docx")而且,如果它正常工作,您将在当前工作目录中获得一个名为"my file.docx“的Word文件,其中包含一个图形。
是否有办法解决rmarkdown暂时保存这个png文件的需要?我能否将这个临时文件的目录设置为将具有写权限的其他目录?
发布于 2022-06-27 16:34:06
一种可能的解决方法是在临时目录中呈现Markdown,并将生成的文件复制到目标see
myFun <- function(mydata, filename){
G <- ggplot2::ggplot(mydata, ggplot2::aes(x = A, y = B)) +
ggplot2::geom_point()
tmpdir <- tempdir()
on.exit(unlink(tmpdir))
OutPath <- dirname(filename)
FileName <- basename(filename)
rmarkdown::render(system.file("rmarkdown/templates/myplot/skeleton/skeleton.Rmd",
package="mypackage"), output_dir = tmpdir,
output_file = FileName, quiet = TRUE)
file.copy(file.path(tmpdir,FileName,OutPath, overwrite = T))
}发布于 2022-06-27 16:38:13
在评论之后,这可能会有所帮助。您可以在rmd文件中绘制图:
---
title: "Untitled"
date: "6/27/2022"
output: html_document
params:
input_df: NULL
---
```{r setup, include=FALSE}knitr::opts_chunk$set(echo =真)
mydata_rmarkdown <- params$input_df
## plot
```{r pressure, echo = FALSE}G <- ggplot 2::ggplot 2(mydata_rmarkdown,ggplot 2::aes(x= A,y= B)) +
ggplot2::geom_point()G
并将你的功能改变为:
myFun <- function(mydata, filename){
OutPath <- dirname(filename)
FileName <- basename(filename)
rmarkdown::render(system.file("rmarkdown/templates/myplot/skeleton/skeleton.Rmd",
package = "mypackage"), output_dir = OutPath,
params = list(input_df = mydata)
output_file = FileName, quiet = TRUE)
}调用该函数:
df1 <- data.frame(A = 1:10, B = 1:10)
df2 <- data.frame(A = 10:20, B = 10:20)
myFun(mydata = df1, filename = "my file.docx")
myFun(mydata = df2, filename = "my file.docx")它在当前形式上非常有限,因为您需要df1和df2具有相同的变量名等,但可能会帮助您完成任务。
https://stackoverflow.com/questions/72737498
复制相似问题