knitr::opts_chunk$set( collapse = TRUE, comment = "#>" )
library(bslib)
{shinyMobile}
provides a set of tools specifically designed to help you develop user-friendly mobile applications and leverage certain actions on mobile phones. The tools we discuss here are:
preview_mobile()
: a function to preview your app in a large range of mobile devicespullToRefresh
: a feature to refresh the page content by pulling from top to bottomSince V0.2.0, {shinyMobile}
has a function to preview your app in a large range of
mobile devices: iPhone X, iPhone 8+, iPhone8, iPhone 5s, iPhone 4s, iPad, Samsung galaxy S5, Samsung galaxy Note 8, ... either locally on online:
library(shiny) library(shinyMobile) preview_mobile(appPath = system.file("examples/gallery/app.R", package = "shinyMobile"), device = "iphoneX") # This also works with a remote app url hosted on shinyapps.io ...
The local preview is a 4 steps process:
preview_mobile()
with appPath
R -e "shiny::runApp('appPath', port = 3838)"
in a terminal to launch the apppreview_mobile()
has other options such as color and landscape (to preview in landscape mode).
{shinyMobile}
introduces the pull to refresh feature. It may be used to refresh the page content by pulling from top to bottom. This feature is disabled by default but passing pullToRefresh = TRUE
in f7Page()
options will activate it. On the server side, an input, namely input$ptr
is TRUE
when ptr is refreshed and becomes NULL
at the end of the animation (you may run the app below in full screen mode and hold a left click with your mouse from top to bottom):
card( shinyMobile:::create_app_link( "NobwRAdghgtgpmAXGKAHVA6ASmANGAYwHsIAXOMpMAdzgCMAnRRAVwhiLdIAoAdMAPQsAzgwEAbAJZ0BWCdIZQGATwHCAFpIjKAskTqTxcfgEpeEWo2ZbhpKOPF8IAAmf8NW3fsPG851wxwqETCzgC8zgR8YOqkpKjCiAICDFrkDABmUARwGADmkqTqLHQYkkQpaXCZ2XAAtNRQwjB1BIoQAqbmZhDmUoxKytwe2j39iirDmtp6BkY95iPKAILoTq4skuHOGQDsAApQeXDrrs6khUbb-DrKzmio-Lj+Z0SoFyShEVK23KgsDgAKkQsHAMoENNtAVgAKoAUVwzgAJkoANbbABiywAMgBlOEmZ4uM57XFaPJGbFQZScHgvM7OaAANzoSm2ewAclAWUpTgzXBdSFcIvx9gDxOciM5QeC4BonvT+eooJIGFIIHBMTj8YrXITdZKiOJWQx2btgUaTXz+cFhIVyi4RWA6EQ4kQYArifydrtsVpUdxxFA6HAJU6-RB0QBGJ7OdSBDLXGJxBJJATUDP5IhECm5YgesD6r38vYRgNBkNhtxgMvOABMsfjYKTsXiiWSGeoWZzRgw+a6xb1RO9AGJnDAVS5iGQKKQDaXJL8Da4bHBSFDYQjl85bAwSHkN-Dh97kZImZIkdUvs5oUftxxL0n4EjJFBPSfnEH0OIhlHEABmREMjYAgPggbgACsTGcEBt1cBdbAASXIGBrQ-QVhU-Nd0mEYAIIAXWPD8AkkPJYiTLBSPI8gAA85z8QcT2fV8zUQ6donsJQYAAfQyQxxAHYjnB6D8AF8RP5CS9ReItXGEaomWqdkQLA7gtH+UhEVpDTEXk4Q7RIaDYOLfR5IYRS-lSMg1IgDSABJ3gYEwpLcEy6DMxS4UU6z1JYUgHNIBhEWM71HNxOxSBEZwAB46mcSRExs+zHOg-gSH4eddgAEVfcQczQs5aPXCJUCachuAAckc+LhAqxEwoikRZJPUhlFQTUnXsap6INFzxJeUTujAUT8KAA", #nolint "app", header = FALSE ), full_screen = TRUE, style = "width: 393px; margin: 0 auto; float: none;" )
{shinyMobile}
contains functionality to retrieve information about the device displaying your app, the last input that was used and other information about the running Shiny session. This information helps you to set the layout as best as possible.
{shinyMobile}
has a predefined input, namely input$deviceInfo.
card( shinyMobile:::create_app_link( "NobwRAdghgtgpmAXGKAHVA6ASmANGAYwHsIAXOMpMAdzgCMAnRRAVwhiLdIAoAdMAPQsAzgwEAbAJZ0BWCdIZQGATwHCAFpIjKAskTqTxcfgEpeEWo2ZbhpKOPF8IAAmf8NW3fsPG851wxwqETCzgC8zgR8YOqkpKjCiAICDFrkDABmUARwGADmkqTqLHQYkkQpaXCZ2XAAtNRQwjB1BIoQAqbmZhDmUoxKytwe2j39iirDmtp6BkY95iPKAILoTq4skuHOGQDsAApQeXDrrs5EqKTlEKERUrbcACZKANbbAGLLADIAygCiJlw-jOV1IRm2-B0ymcaFQ-CBLjOex+WjyRi+UGUnB4wLOzmgADc6EptnsAHJQIlKU541yg8ERfjLAg5YShR5wAmSHLOLQZIjw3G09RQSQMKQQOAfb7-BG0s4aKCPIjUbYAFSwAFU-kLXIDdc4AMTOGCilzEMgUUgGgnVYlXGBquAAD1IAHkWPFPdE+QKwD08QHnPrEcJqraGKS2AQriRuFpUJ7cOdPYnSCZnCAhdi0wASX3OAA8dWcgQgHIY+1SZG4WcReITntzHK5OQAkhB+UKAL5B7vdMDdgC6QA", #nolint "app", header = FALSE ), full_screen = TRUE, style = "width: 393px; margin: 0 auto; float: none;" )
All this information is related to the device running the application. The following information is returned:
input$deviceInfo$ios
: TRUE for iOS deviceinput$deviceInfo$android
: TRUE for Android deviceinput$deviceInfo$androidChrome
: TRUE for Android Chromeinput$deviceInfo$desktop
: TRUE for desktop browserinput$deviceInfo$iphone
: TRUE for iPhoneinput$deviceInfo$ipod
: TRUE for iPodinput$deviceInfo$ipad
: TRUE for iPadinput$deviceInfo$cordova
: TRUE when app running in cordova environmentinput$deviceInfo$capacitor
: TRUE when app running in capacitor environmentinput$deviceInfo$windows
: TRUE for desktop windowsinput$deviceInfo$macos
: TRUE for desktop macOSinput$deviceInfo$ie
: TRUE for Internet Explorer browserinput$deviceInfo$edge
: TRUE for MS Edge browserinput$deviceInfo$firefox
: TRUE for FireFox browserinput$deviceInfo$electron
: TRUE when app is running under Electron environmentinput$deviceInfo$nwjs
: TRUE when app is running under NW.js environmentinput$deviceInfo$webView
: TRUE if app runs in web view - webapp installed to home screen, valid for desktop PWAs installed to desktopinput$deviceInfo$standalone
: Same as webViewinput$deviceInfo$os
: Contains OS can be ios, android, macos, windowsinput$deviceInfo$osVersion
: Contains OS version, e.g. 11.2.0input$deviceInfo$pixelRatio
: Device pixel ratioBelow an example that displays a card only when the app is on desktop:
card( shinyMobile:::create_app_link( "NobwRAdghgtgpmAXGKAHVA6ASmANGAYwHsIAXOMpMAdzgCMAnRRAVwhiLdIAoAdMAPQsAzgwEAbAJZ0BWCdIZQGATwHCAFpIjKAskTqTxcfgEpeEWo2ZbhpKOPF8IAAmf8NW3fsPG851wxwqETCzgC8zgR8YOqkpKjCiAICDFrkDABmUARwGADmkqTqLHQYkkQpaXCZ2XAAtNRQwjB1BIoQAqbmZhDmUoxKytwe2j39iirDmtp6BkY95iPKAILoTq4skuHOGQDsAApQeXDrrs5EqKTlEKERUrbcACZKANbbAGLLADIAygCiJlw-jOV1IRm2-B0ymcaFQ-CBLjOex+WjyRi+UGUnB4wLOzmgADc6EptnsAHJQIlKU541yg8ERfjLAg5YShR5wAmSHLOLQZIjw3G09RQSQMKQQOAfb7-IWuQFy5wAYmcMFFLmIZAopEVmwA8ix4obogQlI9TAjaTtdgAhcREAgvbgACQAKjovsNUKkyBlogBJdlwYQvUgXRDOACkwnhznIAA9SAajTiwCJqstjmRY1oJVKIq6sABVAEmMuWs49eUV4TVAnVUlsAhXEjcLSoQ24c6GjukEzOEBCoXY3sAEnTDEz2ucAB46s5AhAOQxXXBE22IGOOVycv6IPzRxyQ2HUFWzkKVVnqlByDDImbzhBxND+QxnEfQxdhz3DaPTQxHlnedF2XIt-W4QdETxQIAEcNy3TluTgPcDw-E8zzxPYAGEzRpWl+FdTRQkkUIoGcYRJBgVBwX-QDqEKdRnGo9U4zXUgKytOhDXvADQlNFx7GEIhIhIOwtDjdQ4DFc5qBcSSoGXDjaX5Ih0i7e5SGcLk4GoLtKKOOAuyIN8oG0c4igbOAjHgMgMH4RUMOcABfM8nO6MAnIAXSAA", #nolint "app", header = FALSE ), full_screen = TRUE, style = "width: 393px; margin: 0 auto; float: none;" )
{shinyMobile}
has input$lastInputChanged
which returns the name, value and type of the last changed input:
card( shinyMobile:::create_app_link( "NobwRAdghgtgpmAXGKAHVA6ASmANGAYwHsIAXOMpMAdzgCMAnRRAVwhiLdIAoAdMAPQsAzgwEAbAJZ0BWCdIZQGATwHCAFpIjKAskTqTxcfgEpeEWo2ZbhpKOPF8IAAmf8NW3fsPG851wxwqETCzgC8zgR8YOqkpKjCiAICDFrkDABmUARwGADmkqTqLHQYkkQpaXCZ2XAAtNRQwjB1BIoQAqbmZhDmUoxKytwe2j39iirDmtp6BkY95iPKAILoTq4skuHOGQDsAApQeXDrrs5EqKTlEKERUrbcACZKANbbAGLLADIAygCiJlw-jOV1IRm2-B0ymcaFQ-CBLjOex+WjyRi+UGUnB4wLOzmgADc6EptnsAHJQIlKU541yg8ERfgASQgqBYpGc7MMwnhuNp6igkgYUggcA+33+fNcgKlzlIRCI4mJDFJuwAKgqldTZa5gsJCtcIWA6EQ4kQYLzEbSdrsvloXtxxFA6HBxEa7RA3gBGeHOdSBDJG2LxRLJajh-IKtG5YgWsAyq20vYeh1Ol1uxlgFPOABMvv9cEDmeDCSSAnD1EjRGjGFjXUT0oR1oAxM4YIKXMQyBRSLK9gBhJSPGm0+lizNaNmkAAkSxZGSIlutrgJ1WJVxgargAA9SAB5dlT6JaBc8+MJ63JyQPHU2re77iT9lMx5G8i731p11G++9+NN5dkSkR5qkfVln1fTN2mOH08GcL8MzcMAsCgCBjl9GAtG2AAGXA2ygbdthzPCCXsFhx2cL08NsIIcIwL0L0A3YfnIdBQKfUgXyNGi2IYWC8IQo0WKCVBqgwrCIlw-DCIiL0pNI8RyO2ABWHprUYvEByHEc8THI0OOnJ1bBZKd+wFNC4EeJdl1XBh10kTcd33Q92WiIzSDM1Djis+NZTUs5-MY4Rqls0k2AIK4SDAqc8OxKcTGcEA+Ti9lpxPEJnAAHjqZxAggECGH2VIyGi1K5wgBd-NcFKZ3czyLNfbLcooAqirSUraqaTjwI88zvP8gBfbowAGgBdIA", #nolint "app", header = FALSE ), full_screen = TRUE, style = "width: 393px; margin: 0 auto; float: none;" )
This is convenient since usually, there is no shortcut to get the last changed value and this needs to be done server side in Shiny.
input$shinyInfo
gives the current workerId (for shinyapps.io, Shiny Server Pro, Posit Connect) and the unique sessionId (equal to session$token
on the server side).
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.