首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数在我的包中创建一个R标记文档失败与某些工作目录--我能黑客围绕这一点吗?

函数在我的包中创建一个R标记文档失败与某些工作目录--我能黑客围绕这一点吗?
EN

Stack Overflow用户
提问于 2022-06-23 23:15:06
回答 2查看 155关注 0票数 4

我在一个包中编写了一个函数,它将接受用户提供的一些数据,并使用这些数据的图表制作一个漂亮的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?的东西来绕过这种行为吗?

当我提到多个文件和包的文件结构时,我不知道如何准确地创建一个可重复的示例,但这里是我对所需信息的最佳尝试。下面是该函数的一个示例:

代码语言:javascript
复制
 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标记文档如下所示:

代码语言:javascript
复制
---
title: "My Plot"
output: word_document
---

```{r}

G

代码语言:javascript
复制

错误消息“从第6-9行退出”指的是输出G的块。

要调用这一点,您可以使用:

代码语言:javascript
复制
 myFun(mydata = data.frame(A = 1:10, B = 1:10),
       filename = "my file.docx")

而且,如果它正常工作,您将在当前工作目录中获得一个名为"my file.docx“的Word文件,其中包含一个图形。

是否有办法解决rmarkdown暂时保存这个png文件的需要?我能否将这个临时文件的目录设置为将具有写权限的其他目录?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-27 16:34:06

一种可能的解决方法是在临时目录中呈现Markdown,并将生成的文件复制到目标see

代码语言:javascript
复制
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))
  
}
票数 3
EN

Stack Overflow用户

发布于 2022-06-27 16:38:13

在评论之后,这可能会有所帮助。您可以在rmd文件中绘制图:

代码语言:javascript
复制
---
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

代码语言:javascript
复制
## plot

```{r pressure, echo = FALSE}

G <- ggplot 2::ggplot 2(mydata_rmarkdown,ggplot 2::aes(x= A,y= B)) +

代码语言:javascript
复制
 ggplot2::geom_point()

G

代码语言:javascript
复制

并将你的功能改变为:

代码语言:javascript
复制
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)
}

调用该函数:

代码语言:javascript
复制
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")

它在当前形式上非常有限,因为您需要df1df2具有相同的变量名等,但可能会帮助您完成任务。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72737498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档