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.

WarningR fails to initialize on some older devices

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:

  1. Go to Settings > Support and enable Detailed Logging
  2. Restart the app to reproduce the issue
  3. Go back to Settings > Support and check the Startup Log and Error Log for details
  4. 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 on a keyboard) ends most runs within a moment, with your variables intact. Compiled code that never checks for an interrupt, such as a very large matrix product, keeps going until that step returns. The Console says so (“R is still finishing a step it can’t interrupt”) and offers Restart R if you don’t want to wait. Restarting 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. With Save Workspace on (Settings > R Session), your variables are saved to the current project and loaded again, but packages you loaded with library() are not. Put library() calls at the top of your scripts. The console transcript is not kept either; the History tab is.

  • Deep recursion inside compiled R code can exhaust the stack. Functions that profile a model by refitting it repeatedly (for example, confint() on a glm()) can report “Stack size exceeded” on device even when the same code runs fine elsewhere. webRios then shows a banner in the Console and the Editor, “R ran out of stack space”, offering Restart R (after a confirmation) or Not Now. Errors mentioning “recursive default argument reference” later in the same session are a consequence of the first failure rather than a separate problem, and bring the banner back. confint.default() computes Wald intervals without profiling and avoids the issue.

Editor

  • Editing a Windows (CRLF) file can mix line endings. Scripts with Windows line endings open, run and save correctly, and the file keeps its line endings. Lines you add with Return, auto-indent or paste use a plain line feed, so an edited file can end up with both kinds. Nothing is lost, and R reads either.

iPad windows

  • Several main windows share some state. Each window has its own editor tabs, but they share the selected tab, the Console, and files opened from Spotlight or Project Details. With two main windows open, a script opened from another app or from Spotlight can open in the other window’s editor.

Environment

  • The data frame viewer doesn’t notice every change made in the Console. If you change a data frame in R while it is open in the viewer, the viewer reloads when the number of rows or columns changes and tells you why. An edit that keeps the same shape, such as changing one value, is not picked up until you reopen the viewer.

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 in this session can’t be removed until R restarts. remove.packages() deletes the saved copy, so the package is not restored at the next launch, but webR keeps a package installed in the running session available until R restarts. The Console says so.

  • Some packages in Browse have no description. The one-line titles under each package name come from a list bundled with the app. A package added to the repository after this release 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() and read.csv() can fetch from servers that send permissive CORS headers, but not from those that do not. This is the same restriction any web page has, and it applies to the webR REPL in a browser too. https://repo.r-wasm.org works. https://www.r-project.org and https://google.com do 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)

Available in webRios v1.2.0 and later. By default, requests go straight from your device to the site you asked for. See How network access works below for details.

How network access works

R compiled to WebAssembly has no sockets of its own, so curl cannot simply open a connection. The webR project solved this by adding a mechanism that turns those connections into WebSockets and tunnels them through a SOCKS proxy. That is the part that made any of this possible, and it is entirely their work.

webR’s design expects you to supply that proxy. webRios runs one inside the app, so by default requests from R go directly from your device to the site you asked for. Nothing is relayed through a third-party server. For https sites, curl negotiates TLS end to end with the destination, so what passes through the app is already encrypted. Plain http requests are 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. It is a shared service with public credentials, not run by webRios. It can see your device’s 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 curl can’t reach the network. This includes httr2, and packages such as readr, vroom and xml2 when they read from a URL, because they switch to curl once it is installed. Requests fail immediately with Unsupported proxy scheme for 'on-device-proxy-unavailable://…'. Installing packages and download.file() use a different 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 come back, webRios checks the on-device proxy and starts it again, usually on a new port, and points R at it. If it can’t, R’s curl requests are blocked for the rest of the session, never rerouted, and the Console suggests restarting R. The same check covers the app’s internal file server, which serves R’s own files, including Help pages it has not opened yet; if that can’t recover, the Console also suggests restarting R.

Plots

  • The gallery keeps a limited number of plots. It keeps your 20 most recent unpinned plots, removing the oldest as new ones arrive, plus up to 20 pinned plots. Pinned plots are kept between launches; the others last until you quit the app. Pin or export any plot 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 is loaded into R at launch, and one of around 100 MB can take minutes. If a workspace fails to load, or its load is cut off twice in a row (for example, you force-quit the app while it loads), webRios renames the file aside with a timestamp, in the same project folder, and tells you in the Console, so the next launch starts cleanly. Nothing is deleted. Leaving the app while a workspace loads doesn’t count against it.

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