Packages missing in shiny-server

10,621

Solution 1

Compare the output of .libPaths() in both cases and adjust accordingly in the server instance / your script.

You may for example have the packages in "your" R package directory which the server cannot access. System-wide package installations are preferable in cases like this -- and are e.g. the default on Debian / Ubuntu.

Solution 2

The problem is that shiny-server cannot find the packages that you install because it runs them as a different user which is called shiny. This user is created upon installation of shiny-server

The easiest (and safest IMHO) way to solve this is to just install the packages as the shiny user, using the following steps.

  1. Set a password for the user using sudo passwd shiny, now enter and confirm a password
  2. Switch to the shiny account using: su - shiny
  3. Call up R using $ R (without sudo)
  4. Install the required packages, in this case: install.packages("plyr")

Note that if you have rstudio-server installed on the same machine then you can perform steps 2-4 using that interface. Simply go the same domain/ip and use :8787 for the rstudio-server interface instead of :3838 for shiny-server.

Adapted from my answer here.

Solution 3

Here might be a solution that doesn't mess up with the system library. Put the following code at the beginning of the server.R.

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

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

}

This lets Shiny look for packages installed in your own library preferentially and also keeps the packages you use to develop the app and the packages used when the app is deployed in sync.

Note that you may need to tweak permissions of your library folder for the shiny user to see it properly. Otherwise it will fail to look into your specified location without any error message.

Share:
10,621
Sacha Epskamp
Author by

Sacha Epskamp

I am a PhD-student at the University of Amsterdam, department of Psychological methods. For more information please see my website: http://sachaepskamp.com

Updated on June 24, 2022

Comments

  • Sacha Epskamp
    Sacha Epskamp almost 2 years

    I am trying to create a web application using shiny. It requires me to load a package I have installed on my computer. For example:

    ## 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)
      })
    })
    

    This works fine if I run it locally (using runApp) but when I try to run it via my server (same computer) I get the error that the plyr package (or any other package I try to use this way) is not installed. How could I use extra packages in shiny server?