I have created a Shiny app for a user who will run the application locally (after installing R). What is the best, most professional way to distribute the code to that user that minimizes the technical burden on the user and allows for easy maintenance? There will be one file with tokens that can't be stored in GitHub, but the remainder of the code will be in a GitHub repository. If I make a change to the code, I'd love for it to be a simple process for the user to update the local version of the app.
Golem is a good option for this, which you can read about here. The upside is that a Golem app is it's own package, so you get all of the advantages of reproducibility that come with package development.
Thanks so much for your reply. I will investigate golem further, but it doesn't immediately seem to fit my need, although I may be missing something. The Shiny application I'm interested in sharing with a user (who must run it locally) is a fully-developed, complex, multi-file (thousands of lines of code) Shiny application that already exists in a GitHub repository. It seems like Golem is a good way to begin developing a Shiny app. It is not clear to me how the end user makes use of Golem to download code, updates... Thank you!
Perhaps I'm misunderstanding the problem... If your user is savvy enough to download R and run your app locally, then would it be to much to ask them to
git fetch origin every time you let them know that you've updated the app?
It seems to me that no matter how you set up the application, if your deployment involves them running code locally, they will either need to consistently keep the app up to date with the remote themselves, or I suppose you could write them an R Script that follows these steps:
- Check if their local master branch is up to date with the remote (
git2ris a good package to use for this).
- If their branch is NOT up to date, do something like
git2r::fetchto bring it up to date.
- If their branch is up to date, then run the shiny app.
Is that the workflow you are looking for and you just need the code for it? Or am I missing the problem entirely?