【问题标题】:Copy .rmd file included in a Rstudio addin package to a user defined directory将 Rstudio 插件包中包含的 .rmd 文件复制到用户定义的目录
【发布时间】:2016-07-28 16:58:18
【问题描述】:

我有一个位于 here 的 rstudio 插件包。

其中一个插件允许用户定义一个目录,它会将位于包中的文件复制到该目录。

文件所在位置:

atProjectManageAddins/inst/Docs/RMarkdownSkeleton.Rmd

我正在尝试将其复制到用户定义的目录,如下所示:

 file.copy("inst/Docs/RMarkdownSkeleton.Rmd", 
           paste0(Dir, FolderName, "/Reports/", FolderName, "_report.Rmd"))

我试图将它从包中的位置复制到用户定义的位置(基于两个单独的参数DirFolderName)。

但这似乎不起作用。我的假设是我没有以正确的方式引用包目录。我试过./Inst/~/Inst/,也许还有更多。我现在的假设是,我无法让file.copy() 工作有一个更系统的原因。

有什么建议吗?这甚至可能吗?

请注意,如果我通过source()runGadget() 在本地运行该函数,它就可以正常工作。只有当安装了包并且我使用了引用安装包的 RStudio 插件 GUI 时,它才会失败。因此,我很确定我没有正确定义已安装的 .Rmd 文件的文件路径。

编辑:根据 Carl 的建议(可以在 github 上看到),我已更改为以下内容,但文件仍未被复制。

file.copy(system.file("Docs","Rmarkdownskeleton.rmd",package="atProjectManageAd‌​dins"),
 paste0(Dir, FolderName, "/Reports/", FolderName, "_report.Rmd"))

【问题讨论】:

  • 你试过file.path吗?
  • 我做到了。我发现了一些使用file.path 处理类似问题的问题/解决方案,但最终无法找到可行的解决方案。
  • 有趣。我还没来得及克隆/测试你的包,但与data.table相比,我的源代码有/inst/tests/tests.Rraw,但在编译时,包的安装版本不再有/inst文件夹,而是在主目录有/tests/tests.Rraw。您能否检查已安装包的目录结构以确保这是文件实际结束的位置?
  • 如果您还没有阅读,请务必阅读this
  • file.copy(system.file("Docs","Rmarkdownskeleton.rmd",package="atProjectManageAddins",paste0(Dir, FolderName, "/Reports/", FolderName, "_report.Rmd"))怎么样

标签: r r-package file-copying


【解决方案1】:

system.file 是从包中获取文件的最佳函数。我相信这应该适合你:

file.copy(system.file("Docs","Rmarkdownskeleton.rmd",package="atProjectManageAd‌​dins"),
paste0(Dir, FolderName, "/Reports/", FolderName, "_report.Rmd"))

【讨论】:

  • 如果我只是简单地获取函数并使用 runGadget(),这是可行的,但是当我从已安装的包中运行更新的插件时,它不会复制它们。
  • 嗯,我得进一步调查。
  • 我正在调试自己,但是我必须对“本地”工作的插件进行任何调试测试,一旦从包中安装,最终什么都不做。我想知道插件是否存在任何奇怪的权限问题。
  • 添加print(system.file(package="shiny"))会发生什么
  • 这是我试图运行的那种测试,我已经将代码放在闪亮的服务器中,observeEvent() 也是如此,当我 source()runGadget() 他们将您期望的打印到控制台,但是当通过 github 安装并通过插件下拉菜单运行时,控制台根本没有打印任何内容。
【解决方案2】:

将文件放在inst/ 中的想法是对的。

使用此代码将文件从包目录复制到当前目录:

file.copy(from = file.path(path.package("packagename"), "path/to/file"),
      to = file.path("path/to/file"), overwrite = T)

file.path 通过连接传递给它的字符串来创建路径(自动添加特定于操作系统的分隔符)。
path.package 检索加载包的路径。 inst/ 中的文件在安装时被复制到包目录的根目录,因此此处的“路径/到/文件”应该是相对于您的 inst/ 目录的路径。
overwrite 可用于覆盖如果文件已存在,则为该文件。

在您的具体情况下,这应该可以解决问题:

file.copy(file.path(path.package("atProjectManageAddins"), "Docs/RMarkdownSkeleton.Rmd", 
          file.path(getwd(), "Reports", paste0(reportName, "_report.Rmd")))

【讨论】:

    猜你喜欢
    • 2019-06-22
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多