Running R on Windows on ARM on GitHub Actions

Screenshot of the Windows on ARM runner label in a GitHub Actions workflow file.

Introduction

GitHub has recently announced that Windows ARM64 runners are now available under the windows-11-arm label.

I help maintain an R package, TwoSampleMR, which has quite alot of users. The package is not on CRAN because several of its dependencies are only on GitHub, and for a package to be on CRAN essentially all of its dependencies must also be on CRAN. As a result I am always interested to try installing the package on new operating systems and architectures.

(In this post I will use ARM and AARCH64 interchangeably.)

Setting up R AARCH64 on Windows on ARM

Avoiding confusion with the default runner software

It is important to mention that the x86_64 version of R 4.4.2 and RTools44 are included in the default software set for the windows-latest GitHub Actions runner. And the directory including its binaries are on the PATH environment variable (specifically C:\Program Files (x86)\R\R-4.4.2\bin\x64). As a result if you run R, Rscript, or R CMD batch etc. in a shell in the runner you will obtain the x86_64 version of R (which runs under emulation on the ARM runner). Let’s say this is not what we want, so to setup the ARM version of R we need to install it ourselves.

Installing AARCH64 R and RTools45

Tomas Kalibera from the R Core Team has provided several excellent posts ( here and here) about R for Windows on ARM, and installers for it have been available for some time.

The r-hub API does not yet provide the installer information for the AARCH64 version of R, so I came up with the following workflow file - amended from r-lib/actions to install R 4.5.0 and RTools45. Place such a (GitHub Actions workflow) file in a public GitHub repo in a .github/workflows directory, and enable GitHub Actions in the repo settings.

on:
  push:
    branches: [main, master]
  pull_request:
    branches: [main, master]
  workflow_dispatch:

name: Check-install-win-11-arm

permissions: read-all

jobs:
  windows-11-on-arm:
    runs-on: windows-11-arm

    name: windows-11-arm

    strategy:
      fail-fast: false

    env:
      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
      R_KEEP_PKG_SOURCE: yes

    steps:
      - name: Install R and RTools for Windows on ARM and install TwoSampleMR
        run: |
          $url = "https://www.r-project.org/nosvn/winutf8/aarch64/R-4-signed/R-4.5.0-aarch64.exe"
          Invoke-WebRequest -Uri "$url" -OutFile R-4.5.0-aarch64.exe -UseBasicParsing -UserAgent "NativeHost"
          Start-Process -FilePath R-4.5.0-aarch64.exe -ArgumentList "/install /norestart /verysilent /SUPPRESSMSGBOXES" -NoNewWindow -Wait
          $url = "https://cran.r-project.org/bin/windows/Rtools/rtools45/files/rtools45-aarch64-6536-6492.exe"
          Invoke-WebRequest -Uri "$url" -OutFile rtools45-aarch64-6536-6492.exe -UseBasicParsing -UserAgent "NativeHost"
          Start-Process -FilePath rtools45-aarch64-6536-6492.exe -ArgumentList "/install /norestart /verysilent /SUPPRESSMSGBOXES" -NoNewWindow -Wait
          $rscript = "C:\Program Files\R-aarch64\R-4.5.0\bin\Rscript.exe"
          $arguments = "-e", "print(R.version); # the rest of your R code goes here ..."
          & $rscript $arguments

Breaking down the final steps section of this;

  • we define the url of the R 4.5.0 aarch64 installer;
  • we then download the installer using Invoke-WebRequest (note that the default shell in Windows is Powershell);
  • we then run the installer using Start-Process. I am not sure if I need all of the arguments I have specified here but it seems to work.
  • We then do the same for RTools45.
  • We then define a variable for the path to the Rscript.exe binary;
  • we define a variable containing the arguments we want to pass to Rscript;
  • we then invoke Rscript using our two variables and the & call operator.

Then we navigate to our GitHub repo and view the output in the Actions tab under the relevant run.

Of course if you want to run your own R script you’ll need an initial step to checkout your repo.

To confirm that we really have launched the AARCH64 version of R we see the output of print(R.version) is as follows.

print(R.version)
#>                _                           
#> platform       aarch64-w64-mingw32              
#> arch           aarch64                          
#> os             mingw32                          
#> crt            ucrt                             
#> system         aarch64, mingw32                 
#> status                                          
#> major          4                                
#> minor          5.0                              
#> year           2025                             
#> month          04                               
#> day            11                               
#> svn rev        88135                            
#> language       R                                
#> version.string R version 4.5.0 (2025-04-11 ucrt)
#> nickname       How About a Twenty-Six 

Summary

I have shown how to install the AARCH64 version of R and RTools45 on the recently released Windows on ARM runner in GitHub Actions.

As an aside, I note that we are now in the interesting position in that GitHub Actions now has Windows, macOS, and Ubuntu Linux all available on both x86_64 and ARM architectures.

Tom Palmer
Tom Palmer
Senior Lecturer in Biostatistics applied to Genetics

My research interests include statistical methods for epidemiology.

Related