4

我正在尝试使用闪亮创建一个 Web 应用程序。它需要我加载已安装在计算机上的软件包。例如:

## Contents ui.R:
library(shiny)
library(plyr)

shinyUI(pageWithSidebar(

  headerPanel("Hello Shiny!"),

  sidebarPanel(
    sliderInput("obs", 
                "Number of observations:", 
                min = 0, 
                max = 1000, 
                value = 500)
  ),

  mainPanel(
    plotOutput("distPlot")
  )
))

## Contents server.R:
library(shiny)
library(plyr)

shinyServer(function(input, output) {

  output$distPlot <- renderPlot({

    # generate an rnorm distribution and plot it
    dist <- rnorm(input$obs)
    hist(dist)
  })
})

如果我在本地运行它(使用runApp),这工作正常,但是当我尝试通过我的服务器(同一台计算机)运行它时,我收到plyr未安装包(或我尝试以这种方式使用的任何其他包)的错误。我怎么能在闪亮的服务器中使用额外的包?

4

6 回答 6

9

问题是 shiny-server 找不到您安装的软件包,因为它以不同的用户身份运行它们,称为shiny. 该用户是在安装闪亮服务器时创建的

解决此问题的最简单(也是最安全的恕我直言)方法是使用以下步骤以闪亮用户身份安装软件包。

  1. 为用户设置密码sudo passwd shiny,现在输入并确认密码
  2. 使用以下命令切换到闪亮帐户:su - shiny
  3. 调用R使用$ R(不带 sudo)
  4. 安装所需的包,在这种情况下:install.packages("plyr")

请注意,如果您在同一台机器上安装了 rstudio-server,那么您可以使用该界面执行步骤 2-4。只需转到相同的域/IP 并使用 :8787 作为 rstudio-server 接口,而不是使用 :3838 作为闪亮服务器。

改编自我在这里的回答。

于 2015-10-07T15:43:26.123 回答
8

比较.libPaths()两种情况下的输出并在服务器实例/您的脚本中进行相应调整。

例如,您可能在“您的”R 包目录中有服务器无法访问的包。在这种情况下,系统范围的软件包安装更可取——例如,Debian / Ubuntu 上的默认安装。

于 2013-04-17T16:56:32.850 回答
2

这可能是一个不会弄乱系统库的解决方案。将以下代码放在server.R.

user <- unname(Sys.info()["user"])
if (user == "shiny") {

  # Set library locations
  .libPaths(c(
    "/path/to/your/own/library"
  )
  )

}

这让 Shiny 可以优先查找安装在您自己的库中的包,并且还可以使您用于开发应用程序的包与部署应用程序时使用的包保持同步。

请注意,您可能需要调整库文件夹的权限,以便shiny用户正确查看。否则它将无法查看您指定的位置而不会出现任何错误消息。

于 2017-12-05T16:33:11.117 回答
0

我已经从 R 3.2 升级到 3.4 并遇到了同样的问题,然后我在 R/x86_64-pc-linux-gnu-library/ 中创建了一个名为 3.4 的文件夹,并从 3.2 文件夹中复制了所有内容(它已经在同一个位置)。

于 2017-09-04T07:11:00.223 回答
0

如果软件包安装在您的 R 库中。让它在闪亮服务器上运行的最简单方法是向闪亮指示包所在的库目录。类似的东西: library(plyr, lib.loc="/usr/local/lib/R/site-library")。如果您安装了 R-Studio,您可以使用以下命令查看目录.libPaths()

于 2019-08-11T11:06:33.437 回答
-2

为什么需要 Plyr?您的代码中没有任何内容在使用它;但无论如何,您可以通过运行 R 在 Linux R 安装上安装软件包,然后 install.packages('plyr');

于 2013-07-23T00:44:51.273 回答