knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
library(bslib)

Tools for mobile development

{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:

Mobile preview

Since 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() has other options such as color and landscape (to preview in landscape mode).

Pull to Refresh

{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;"
)
wzxhzdk:4

Predefined input values

{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.

Information about your current device

{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;"
)
wzxhzdk:6

All this information is related to the device running the application. The following information is returned:

Below 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;"
)
wzxhzdk:8

Information about Shiny inputs

{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;"
)
wzxhzdk:10

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.

Other information

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).



RinteRface/shinyMobile documentation built on Jan. 27, 2025, 5:40 p.m.