web-dev-qa-db-fra.com

développer une application brillante en tant que package et la déployer sur un serveur brillant

Je développe une application brillante et comme je voulais utiliser des tests et une documentation automatisés de la fonction, j'ai commencé à développer l'interface dans un package (comme recommandé ici ).

Je développe cette application brillante dans RStudio et j'ai un server.R fichier sur lequel je peux cliquer sur le bouton Exécuter l'application dans RStudio et tout fonctionne. Je valide mon package dans un référentiel github et à partir de là, je veux l'installer sur mon R serveur brillant en utilisant devtools et install_github fonction.

Maintenant, je me demande comment démarrer mon application sur le serveur. Je pensais naïvement installer le paquet et pointant vers le server.R fichier, mais cela ne fonctionne pas. Je ne sais pas où sont les problèmes.

Mon deuxième essai consistait à créer un fichier appelé app.R dans un dossier accessible par le serveur shiny et dans ce fichier, je charge essentiellement mon package, shiny et les autres packages nécessaires mais il se plaint en quelque sorte à cause des variables manquantes ...

Quelqu'un peut-il me donner un conseil? Je suis également heureux de répondre à toutes les questions car je ne sais pas comment poser correctement ce problème. Merci d'avance.

EDIT Déploiement sur un serveur brillant

Puisque Colin D demandait dans les commentaires, comment déployer ces packages sur un serveur brillant, je voulais montrer comment je fais cela.

Tout d'abord, j'installe mon package sur le serveur brillant directement via la ligne de commande en tant que root avec la commande suivante.

su - -c "R -e \"devtools::install_github('user/shinypackage')\"" 

L'étape suivante consiste à changer le propriétaire du dossier du package

chown -R shiny:shiny /usr/local/lib/R/site-library/shinypackage/

Ensuite, je redémarre le serveur brillant car cela était parfois problématique avec la mise en cache ou ainsi.

systemctl restart shiny-server

Ce sont les étapes que je fais lorsque je mets à jour mon application brillante. Je le fais normalement à nouveau en tant que root sur une seule ligne

su - -c "R -e \"devtools::install_github('user/shinypackage')\"" &  chown -R shiny:shiny /usr/local/lib/R/site-library/shinypackage/ & systemctl restart shiny-server

Une chose que nous devons encore faire est de configurer le répertoire dans le shiny-server.conf fichier. Je viens d'ajouter le chemin du package + le répertoire de l'application où le ui.R et server.R est enregistré.

  location /shinypackage {
    app_dir /usr/local/lib/R/site-library/shinypackage/application;
    log_dir /var/log/shiny-server;
  }

Ensuite, je dois redémarrer le serveur à nouveau en utilisant systemctl restart shiny-server.

Ceci est utilisé sur un serveur Ubuntu.

30
drmariod

Lorsque je crée des applications brillantes en tant que package autonome, j'organise généralement les fichiers comme suit:

Dans le répertoire R:

  • Toutes mes méthodes pour prendre en charge l'application (celles-ci doivent être exportées si elles seront utilisées dans le ui.R, server.R, ou global.R des dossiers)
  • UNE launch_application fonction

La définition de launch_application est similaire à:

launch_application <- function(x, ...)
{
  shiny::runApp(appDir = system.file("application", package = [my_pkg]),
                ...)
}

Dans le répertoire inst

  • application/server.R
  • application/ui.R
  • application/global.R

Après avoir construit et installé le package, j'ai juste besoin de lancer

library(my_pkg)
launch_application(...)
24
Benjamin

Il y a déjà une réponse acceptée avec de nombreux votes, mais je voudrais ajouter quelques éléments, je vais donc me répondre moi aussi. Pour plus d'informations, vous pouvez lire mon article Compléter votre package R avec une application Shiny .

Voici la structure de dossiers que j'utilise:

- mypacakge
  |- inst
      |- myapp
         |- ui.R
         |- server.R
  |- R
     |- runApp.R
     |- ...
  |- DESCRIPTION
  |- ...

À l'intérieur de R/ le dossier est l'endroit où je place tout le code non brillant. Le code de l'application brillante se trouve dans inst/. Le R/runApp.R le fichier est défini comme

#' @export
runExample <- function() {
  appDir <- system.file("myapp", package = "mypackage")
  if (appDir == "") {
    stop("Could not find myapp. Try re-installing `mypackage`.", call. = FALSE)
  }

  shiny::runApp(appDir, display.mode = "normal")
}

(Vous pouvez le voir en action; par exemple, shinyalert utilise cette structure pour son application de démonstration).

Dans un commentaire, vous avez demandé comment cela peut-il être déployé sur un serveur brillant. C'est simple, vous pouvez simplement avoir un fichier /srv/shiny-server/myapp.app.R qui appelle et exécute ce package (après avoir installé le package sur le serveur):

dir <- system.file("myapp", package = "mypackage")
setwd(dir)
shiny::shinyAppDir(".")

(Vous pouvez également le voir en action, code ici )

12
DeanAttali

De nombreux packages avec des démonstrations de preuve de concept Shiny ne sont pas conçus pour être déployés sur Shiny Server, mais incluent plutôt quelque chose comme ça dans une fonction destinée à être exécutée à partir de RStudio:

fooRun <- function() {
   app <- shinyApp(appUI, appServer)
   runApp(app, launch.browser = TRUE, ...)
}

Cette fonction ne fonctionnera pas dans Shiny Server (vous ne pouvez pas exécuter runApp dans runApp) mais elle donne quelques indices sur la façon de créer un app.R qui peut agir comme un espace réservé pour utiliser dans /srv/shiny-server/foo/app.R

library("foo")
shinyApp(ui = foo:::appUI, server = foo:::appServer)
0
Jeremy Leipzig