Known Issues
Known limitations and issues in the current version of webRios, along with workarounds where available.
Don’t see your issue here? Open a new issue on GitHub.
We are aware of an issue where webR fails to initialize on some older iPhone and iPad models, even on a supported iOS version. This is related to available memory on the device rather than the iOS version. The app may hang on the loading screen or fail to start an R session. We are actively investigating and working to find a good solution.
If you experience this, you can help us diagnose the problem:
- Go to Settings > Support and enable Detailed Logging
- Restart the app to reproduce the issue
- Go back to Settings > Support and check the Startup Log and Error Log for details
- Tap Send Feedback to submit a report with your logs attached, or share the logs via support@caffeinatedmath.com
Including your device model and iOS version helps us understand the scope of the issue.
Console
Some code only stops when its current step ends. Stop (or Command-period) ends most runs at once, variables intact. Compiled code that never checks for an interrupt, such as a very large matrix product, runs until that step returns. The Console says so and offers Restart R, which clears your variables and loaded packages. See Stopping running code.
Loaded packages are not re-attached at launch. Each launch starts a fresh R session. Save Workspace (Settings > R Session) brings back your variables, not the packages you loaded with
library(), so put those calls at the top of your scripts. The console transcript isn’t kept either; the History tab is.Deep recursion inside compiled R code can exhaust the stack. Functions that profile a model by refitting it (for example
confint()on aglm()) can report “Stack size exceeded” on device though the code runs fine elsewhere. A banner, “R ran out of stack space”, offers Restart R (after asking) or Not Now. A later “recursive default argument reference” error is the same failure, and brings the banner back.confint.default()gives Wald intervals without profiling and avoids it.
Editor
- Editing a Windows (CRLF) file can mix line endings. Such scripts open, run and save with their endings, but lines you add with Return, auto-indent or paste use a plain line feed, so an edited file can mix the two. Nothing is lost, and R reads either.
iPad windows
- Several main windows share some state. Each window has its own editor tabs, but windows share the selected tab, the Console, and files opened from Spotlight or Project Details, so a script opened from another app or Spotlight can land in the other window’s editor.
Environment
- The data frame viewer doesn’t notice every change made in the Console. It reloads when a data frame’s number of rows or columns changes, and says why. An edit that keeps the shape, such as changing one value, shows only when you reopen it.
Packages
Not all CRAN packages are available. Only packages that have been compiled for WebAssembly are available through the webR package repository. Most popular packages (
dplyr,ggplot2,tidyr,stringr, etc.) are supported.No package updates. Once installed, packages cannot be updated to a newer version without clearing the app’s data.
A package installed this session can’t be removed until R restarts.
remove.packages()deletes the saved copy, so it isn’t restored at the next launch, but the running session keeps it. The Console says so.Some packages in Browse have no description. Titles come from a list bundled with the app, so a package added to the repository since shows its name only.
Check availability: Visit the webR package repository to search for available packages before trying to install.
Network access from R
- Reading data from a URL only works for servers that allow it.
download.file(),url(),readLines()andread.csv()reach only servers that send permissive CORS headers, the same rule any web page follows, webR in a browser included.https://repo.r-wasm.orgworks;https://www.r-project.organdhttps://google.comdo not.
Workaround: packages built on curl, including httr2, take a different route and are not subject to CORS, so they can reach any host.
install.packages("httr2")
library(httr2)
resp <- req_perform(request("https://r-project.org"))
resp_status_desc(resp)Since v1.2.0. By default, requests go straight from your device to the site; see How network access works.
How network access works
R compiled to WebAssembly has no sockets, so curl can’t open a connection. The webR project turns those connections into WebSockets and tunnels them through a SOCKS proxy. That part, the one that makes this possible, is entirely theirs.
webR expects you to supply the proxy. webRios runs one inside the app, so by default requests go from your device straight to the site, not through a third-party server. For https, curl negotiates TLS end to end with the site, so what passes through the app is already encrypted. Plain http is not.
The proxy listens only on your device, requires a credential regenerated every launch, and is shut down when the R session restarts.
You can change this in Settings > R Session > Network, and Network Access shows each route in use:
| Setting | What happens |
|---|---|
| On-Device Only (default) | Requests use the on-device proxy. If it can’t start, curl requests are blocked and you’re told. They are never rerouted. |
| On-Device, Public Fallback | Requests use the on-device proxy. If it can’t start, they go through a public proxy hosted at r-universe.dev instead, and you’re told. |
| Public Proxy | Every request goes through the public proxy. The on-device proxy isn’t started. |
The public proxy is the one the WebAssembly build of curl uses on its own, outside webRios: a shared service with public credentials, not run by webRios. It can see your IP address and which sites you connect to, but not the contents of https requests. Changes take effect when R restarts.
When the on-device proxy can’t start, packages that use
curlcan’t reach the network. That includeshttr2, andreadr,vroomandxml2reading from a URL, since they switch tocurlonce it is installed. Requests fail at once withUnsupported proxy scheme for 'on-device-proxy-unavailable://…'. Package installs anddownload.file()take another route and keep working. Restart R to try again, or allow the public proxy as a fallback in Settings > R Session > Network.Blocking is a default, not a sandbox: R code that sets its own proxy, for example with
httr2::req_proxy(), is not affected.After a long time in the background, the on-device proxy may have to restart. iOS can close a suspended app’s network listeners. When you return, webRios restarts the proxy, usually on a new port, and points R at it. If it can’t,
curlrequests stay blocked for the rest of the session, never rerouted, and the Console suggests restarting R. The app’s internal file server, which serves R’s own files such as unopened Help pages, gets the same check and the same suggestion.
Plots
- The gallery keeps a limited number of plots. It keeps your 20 newest unpinned plots, dropping the oldest, plus up to 20 pinned ones. Pinned plots survive a relaunch; the rest last until you quit. Pin or export what you want to keep. See Pinning Plots.
General
Startup time. The first launch takes 5 to 15 seconds while the R WebAssembly runtime loads and initializes. Subsequent launches are faster due to caching.
Memory limit. R needs a meaningful amount of RAM to work with data, but mobile devices have less memory available than desktops. webRios has approximately 300 MB of memory for R. Very large datasets or complex models may exceed this limit. See the FAQ for tips on freeing memory.
Very large saved workspaces load slowly. With Save Workspace on, the whole workspace loads at launch, and one of around 100 MB can take minutes. If a load fails, or is cut off twice in a row (say, by force-quitting), webRios renames the file aside with a timestamp in its project folder and tells you in the Console, so the next launch starts cleanly. Nothing is deleted. Leaving the app during a load doesn’t count.
Package storage. Installed packages are stored locally on your device. Under heavy storage pressure, iOS may reclaim this space. If your installed packages disappear, reinstall them from the Packages tab.