RStudio 插件:小工具不工作(依赖性问题)
RStudio Addin: Gadget not working (Dependency issue)
我的问题与软件包的开发有关。因此,一个最小的可重现示例意味着您也应该创建那个最小的包。我基本上是在尝试构建一个简单的 RStudio 小工具。以下是此包中唯一的 .R
脚本的内容:
#' Gadget
#'
#' A short description
#'
#' @usage myAddin()
#' @import shiny
#' @import miniUI
#' @import shinyFiles
#' @import rstudioapi
#' @export
myAddin <- function() {
requireNamespace("shinyFiles")
requireNamespace("miniUI")
requireNamespace("shiny")
ui <- miniPage(gadgetTitleBar("My Addin"),
miniTabstripPanel(miniContentPanel(HTML("<center>"),
shinySaveButton("backup", "Save file", "Save file as...", filetype = list(RData = "RData"))
)
server <- function(input, output, session) {
volumes <- getVolumes()
shinyFileSave(input, "backup", roots = volumes,
session = session, restrictions = system.file(package = "base"))
observeEvent(input$backup, {
input <- parseSavePath(volumes, input$backup)
stopApp()
})
observeEvent(input$done, {
stopApp()
})
}
viewer <- dialogViewer("My Addin", width = 350,
height = 500)
runGadget(ui, server, viewer = viewer)
}
为了使小工具在 RStudio 中可用,您必须在包根目录的子目录 inst/rstudio/
中添加文件 addins.dcf
(因此 myAddin/inst/rstudio/addins.dcf
)。它的内容是
Name: myAddin
Description: My first Addin
Binding: myAddin
Interactive: true
如果你设法自己构建这个包并安装它,你会在上下文菜单中找到插件 myAddin
:
如果启动插件,您将看到以下内容:
现在,如果您单击 Save file
按钮,将弹出一个对话框,您可以在其中 select 保存文件的路径和名称。这看起来像这样:
不幸的是,这行不通。在上面的最后一张图片中,我在启动插件之前进行了显式调用 library(shinyFiles)
。如果我不这样做,Save
按钮将不起作用。导入 shinyFiles
或使用 ::
明确引用其功能将无法完成这项工作。这是因为当我启动插件时,包本身 (myAddin
) 没有附加(这是启动插件时 RStudio 执行的调用:myAddin:::myAddin()
)。
因此我的问题是:如何在启动插件之前不显式附加包 shinyFiles
的情况下使按钮工作?
我希望我表达清楚了。如果您需要更多信息,请立即联系我。
我对包开发还很陌生,所以请记住这一点。
经过一些调查,我发现这是 shinyFiles
的错误,我 filed a bug report。您可以阅读错误报告以了解详细信息。
至于在包作者正确修复之前的临时解决方法:您可以在 myAddin()
函数中添加 addResourcePath('sF', system.file('www', package='shinyFiles'))
。基本上,问题是 shinyFiles 正在寻找它的 JS 和 CSS 文件相对于它仅在包被攻击时创建的路径,但是因为包从未被附加,所以该路径不会被创建,所以您可以使用 shinyFiles 用来执行此操作的同一行。
edit:我向包发出了一个 pull request 来解决这个问题,所以希望在一些 hours/tomorrow 之后你会有一个可行的解决方案而不必做任何东西
编辑 2:修复已合并。如果您从 github 下载最新版本的 shinyFiles,它应该可以工作
我的问题与软件包的开发有关。因此,一个最小的可重现示例意味着您也应该创建那个最小的包。我基本上是在尝试构建一个简单的 RStudio 小工具。以下是此包中唯一的 .R
脚本的内容:
#' Gadget
#'
#' A short description
#'
#' @usage myAddin()
#' @import shiny
#' @import miniUI
#' @import shinyFiles
#' @import rstudioapi
#' @export
myAddin <- function() {
requireNamespace("shinyFiles")
requireNamespace("miniUI")
requireNamespace("shiny")
ui <- miniPage(gadgetTitleBar("My Addin"),
miniTabstripPanel(miniContentPanel(HTML("<center>"),
shinySaveButton("backup", "Save file", "Save file as...", filetype = list(RData = "RData"))
)
server <- function(input, output, session) {
volumes <- getVolumes()
shinyFileSave(input, "backup", roots = volumes,
session = session, restrictions = system.file(package = "base"))
observeEvent(input$backup, {
input <- parseSavePath(volumes, input$backup)
stopApp()
})
observeEvent(input$done, {
stopApp()
})
}
viewer <- dialogViewer("My Addin", width = 350,
height = 500)
runGadget(ui, server, viewer = viewer)
}
为了使小工具在 RStudio 中可用,您必须在包根目录的子目录 inst/rstudio/
中添加文件 addins.dcf
(因此 myAddin/inst/rstudio/addins.dcf
)。它的内容是
Name: myAddin
Description: My first Addin
Binding: myAddin
Interactive: true
如果你设法自己构建这个包并安装它,你会在上下文菜单中找到插件 myAddin
:
如果启动插件,您将看到以下内容:
现在,如果您单击 Save file
按钮,将弹出一个对话框,您可以在其中 select 保存文件的路径和名称。这看起来像这样:
不幸的是,这行不通。在上面的最后一张图片中,我在启动插件之前进行了显式调用 library(shinyFiles)
。如果我不这样做,Save
按钮将不起作用。导入 shinyFiles
或使用 ::
明确引用其功能将无法完成这项工作。这是因为当我启动插件时,包本身 (myAddin
) 没有附加(这是启动插件时 RStudio 执行的调用:myAddin:::myAddin()
)。
因此我的问题是:如何在启动插件之前不显式附加包 shinyFiles
的情况下使按钮工作?
我希望我表达清楚了。如果您需要更多信息,请立即联系我。 我对包开发还很陌生,所以请记住这一点。
经过一些调查,我发现这是 shinyFiles
的错误,我 filed a bug report。您可以阅读错误报告以了解详细信息。
至于在包作者正确修复之前的临时解决方法:您可以在 myAddin()
函数中添加 addResourcePath('sF', system.file('www', package='shinyFiles'))
。基本上,问题是 shinyFiles 正在寻找它的 JS 和 CSS 文件相对于它仅在包被攻击时创建的路径,但是因为包从未被附加,所以该路径不会被创建,所以您可以使用 shinyFiles 用来执行此操作的同一行。
edit:我向包发出了一个 pull request 来解决这个问题,所以希望在一些 hours/tomorrow 之后你会有一个可行的解决方案而不必做任何东西
编辑 2:修复已合并。如果您从 github 下载最新版本的 shinyFiles,它应该可以工作