Sourcing R script over HTTPS

Is there some way to source an R script from the web?

e.g. source('http://github.com/project/R/file.r')

Reason: I currently have a project that I'd like to make available for use but isn't ready to be packaged yet. So it would be great to give people a single file to source from the web (that will then source all the individual function files).

On closer inspection, the problem appears to be https. How would I source this file?

https://raw.github.com/hadley/stringr/master/R/c.r

Solution 1:

You can use the source_url in the devtools library

library(devtools)
source_url('https://raw.github.com/hadley/stringr/master/R/c.r')

This is a wrapper for the RCurl method by @ROLO

Solution 2:

Yes you can, try running this R tutorial:

source("http://www.mayin.org/ajayshah/KB/R/tutorial.R")

(Source)

Https is only supported on Windows, when R is started with the --internet2 command line option (see FAQ):

> source("https://pastebin.com/raw.php?i=zdBYP5Ft")
> test()
[1] "passed"

Without this option, or on linux, you will get the error "unsupported URL scheme". In that case resort to the solution suggested by @ulidtko, or:

Here is a way to do it using RCurl, which also supports https:

    library(RCurl)
    eval( expr = 
        parse( text = getURL("http://www.mayin.org/ajayshah/KB/R/tutorial.R",
                       ssl.verifypeer=FALSE) ))

(You can remove the ssl.verifypeer if the ssl certificate is valid)

Solution 3:

Yes, it is possible and worked for me right away.

R> source("http://pastebin.com/raw.php?i=zdBYP5Ft")
R> test()
[1] "passed"

Regarding the HTTPS part, it isn't supported by internal R code. However, R can use external utilities like wget or curl to fetch https:// URLs. One will need to write additional code to be able to source the files.

Sample code might be like this:

wget.and.source <- function(url) {
  fname <- tempfile()
  download.file(url, fname, method="wget")
  source(fname)
  unlink(fname)
}

There is a Windows-only solution too: start R with --internet2 commandline option. This will switch all the internet code in R to using IE, and consequently HTTPS will work.

Solution 4:

Windows:

If Internet Explorer is configured to access the web using your organization's proxy, you can direct R to use these IE settings instead of the default R settings. This change can be made once by the following steps:

  1. Save your work and close all R sessions you may have open.

  2. Edit the following file. (Note: Your exact path will differ based on your R installation)

    C:\Program Files\R\R-2.15.2\etc\Rprofile.site

Open this "Rprofile.site" file in Notepad and add the following line on a new line at the end of the file:

utils::setInternet2(TRUE)

You may now open a new R session and retry your "source" command.

Linux alikes:

Use G. Grothendieck's suggestion. At the command prompt within R type:

source(pipe(paste("wget -O -", "https://github.com/enter/your/url/here.r")))

You may get an error saying:

cannot verify certificate - - - - Self-signed certificate encountered.

At this point it is up to you to decide whether you trust the person issuing the self-signed certificate and proceed or to stop.

If you decide to proceed, you can connect insecurely as follows:

source(pipe(paste("wget -O -", "https://github.com/enter/your/url.r", "--no-check-certificate")))

For more details, see the following:

See section 2.19

  • CRAN R Documentation 2.19
  • wget documentation section 2.8 for "no-check-certificate"

Similar questions here:

  • Stackoverflow setInternet2 discussion
  • Stackoverflow Proxy configuration discussion