我们最近在我的办公室里安装了RStudio Connect。对于我们的工作,我们制作了自定义软件包,我们通过打开项目并进行构建和重新加载来对它们进行更新。
我知道我可以使用RSConnect使自定义程序包在应用程序中工作的唯一方法是建立本地存储库,并设置options(repos)
使其包含其中。
目前,我有以下内容:
library(drat)
RepoAddress <- "C:/<RepoPath>" # High level path
drat::insertPackage(<sourcePackagePath>, repodir = RepoAddress)
# Add this new repo to Rs knowledge of repos.
options(repos = c(options("repos")$repos,LocalCurrent = paste0("file:",RepoAddress)))
# Install <PackageName> from the local repo :)
install.packages("<PackageName>")
当前,这很好用,我可以从本地存储库安装我的自定义软件包。这向我表明本地仓库已正确设置。
此外,我将DESCRIPTION
文件更改为在一行中加上repository:LocalCurrent
。
但是,当我尝试部署引用的Shiny应用程序或Rmd时,在部署时出现以下错误:
Error in findLocalRepoForPkg(pkg, repos, fatal = fatal) :
No package '<PackageName> 'found in local repositories specified
我知道这是一个问题,packrat
在部署过程中无法找到我的本地存储库(我相信在使用packrat::snapshot()
的阶段)。这令人困惑,因为我本以为packrat
将使用我的option("repos")
仓库,类似于install.packages
。如果我遵循这些功能,我会看到特定的故障点是packrat:::findLocalRepoForPkg("<PackageName", repos = packrat::get_opts("local.repos"))
,即使定义了packrat::set_opts("local.repos" = c(CurrentRepo2 = paste0("file:",RepoAddress)))
如果我深入研究packrat:::findLocalRepoForPkg
,它将失败,因为它找不到名为“ C://”的文件/文件夹。我本以为这肯定会失败,因为回购遵循C://bin/windows/contrib/3.3/结构。回购在任何时候都不会拥有它想要的结构吗?
我认为这最后一部分表明我对某些事情有严重的误解。有关配置我的存储库的任何指导,以便packrat
都能理解,这是很好的。
答案 0 :(得分:3)
现在应该始终检查RStudio connect支持的选项: https://docs.rstudio.com/connect/admin/r/package-management/#private-packages
我个人不喜欢包含本地/私有软件包的所有选项,因为它违背了为部署闪亮的应用程序提供良好目标的目的。在许多情况下,我不能只在组织中建立本地存储库,因为我没有这样做的权限。我也必须通过电子邮件发送给IT支持人员以使其手动安装新软件包,这也很不方便。总的来说,我认为RS connect是一个很棒的产品,因为它很简单,但是当涉及到本地软件包时,它确实不是。
我找到了Rstudio官方推荐的不错的替代品/ Hack。我想这也可以与shinyapps.io一起使用,但是我还没有尝试过。解决方案如下:
添加到global.R if(!require(local_package))devtools :: load_all(“ ./ local_package”)
编写一个脚本,该脚本复制所有源文件,这样您将获得一个Shinyapp,其中包含本地包的源目录,您可以为该目录调用./inst/shinyconnect/
或本地包将使用的目录复制到./inst/shinyconnect/local_package
清单。
将脚本./shinyconnect/packrat_sees_these_dependencies.R
添加到闪亮的文件夹中,这将由packrat-manifest提取
在构建时缺少rsconnet / packrat来忽略专门命名的软件包
(1)
#start of global.R...
#load more packages for shiny
library(devtools) #need for load_all
library(shiny)
library(htmltools) #or what ever you need
#load already built local_package or for shiny connection pseudo-build on-the-fly and load
if(!require(local_package)) {
#if local_package here, just build on 2 sec with devtools::load_all()
if(file.exists("./DESCRIPTION")) load_all(".") #for local test on PC/Mac, where the shinyapp is inside the local_package
if(file.exists("./local_package/DESCRIPTION")) load_all("./local_package/") #for shiny conenct where local_package is inside shinyapp
}
library(local_package) #now local_package must load
(3)
使脚本加载本地包的所有依赖项。 Packrat会看到这个。该脚本将永远不会实际执行。将其放在./shinyconnect/packrat_sees_these_dependencies.R
#these codelines will be recognized by packrat and package will be added to manifest
library(randomForest)
library(MASS)
library(whateverpackageyouneed)
(4)在部署期间,清单生成器(packrat)将忽略任何已命名的local_package的存在。这是packrat中的一个选项,但是rsconnect不公开此选项。一种方法是将rsconnect加载到内存,并修改sub-sub-sub-function performPackratSnapshot()
以允许这样做。在下面的脚本中,我这样做并部署了一个闪亮的应用程序。
library(rsconnect)
orig_fun = getFromNamespace("performPackratSnapshot", pos="package:rsconnect")
#packages you want include manually, and packrat to ignore
ignored_packages = c("local_package")
#highjack rsconnect
local({
assignInNamespace("performPackratSnapshot",value = function (bundleDir) {
owd <- getwd()
on.exit(setwd(owd), add = TRUE)
setwd(bundleDir)
srp <- packrat::opts$snapshot.recommended.packages()
packrat::opts$snapshot.recommended.packages(TRUE, persist = FALSE)
packrat::opts$ignored.packages(get("ignored_packages",envir = .GlobalEnv)) #ignoreing packages mentioned here
print("ignoring following packages")
print(get("ignored_packages",envir = .GlobalEnv))
on.exit(packrat::opts$snapshot.recommended.packages(srp,persist = FALSE), add = TRUE)
packages <- c("BiocManager", "BiocInstaller")
for (package in packages) {
if (length(find.package(package, quiet = TRUE))) {
requireNamespace(package, quietly = TRUE)
break
}
}
suppressMessages(packrat::.snapshotImpl(project = bundleDir,
snapshot.sources = FALSE, fallback.ok = TRUE, verbose = FALSE,
implicit.packrat.dependency = FALSE))
TRUE
},
pos = "package:rsconnect"
)},
envir = as.environment("package:rsconnect")
)
new_fun = getFromNamespace("performPackratSnapshot", pos="package:rsconnect")
rsconnect::deployApp(appDir="./inst/shinyconnect/",appName ="shinyapp_name",logLevel = "verbose",forceUpdate = TRUE)
答案 1 :(得分:0)
问题是术语之一。
我已经建立了CRAN的仓库。它工作正常,还可以。当packrat
引用local repo
时,它是指本地git风格的仓库。
这解决了为什么findlocalrepoforpkg看起来不起作用的原因-它旨在与其他类型的repo一起使用。
答案 2 :(得分:0)
请随时与我们联系support@rstudio.com
我认为,由于软件包的描述文件中缺少Repository: value
行,因此在packrat中触发了本地软件包代码路径。您提到添加了这一行,可以尝试区分大小写的版本吗?
也就是说,RStudio Connect将无法按照您指定的方式从RepoAddress
安装软件包(在Windows共享上进行硬编码)。我们建议从开发环境和RStudio Connect都可以访问的服务器上通过https托管您的存储库。为了使这种类型的回购设置更加容易,我们刚刚发布了RStudio Package Manager,您(和IT人士)可能会找到一种引人注目的替代方法,可以通过drat手动管理内部软件包的发布。