Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Packages missing in shiny-server

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?

like image 666
Sacha Epskamp Avatar asked Dec 03 '22 23:12

Sacha Epskamp


2 Answers

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.

like image 191
Bastiaan Quast Avatar answered Dec 24 '22 14:12

Bastiaan Quast


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.

like image 32
Dirk Eddelbuettel Avatar answered Dec 24 '22 16:12

Dirk Eddelbuettel