Skip to content

R

We have experimental support for R.

For now, Rscript only support a single script as argument: no expressions or other arguments supported.

Image

You can pull this image as follows:

docker pull registry.scontain.com/sconecuratedimages/apps:R

Running R

First, we determine which SGX device to mount with function determine_sgx_device. To start R, just execute:

determine_sgx_device
docker run $MOUNT_SGXDEVICE -it --rm registry.scontain.com/sconecuratedimages/apps:R

This will output something like this:

export SCONE_QUEUES=4
export SCONE_SLOTS=256
export SCONE_SIGPIPE=0
export SCONE_MMAP32BIT=0
export SCONE_SSPINS=100
export SCONE_SSLEEP=4000
export SCONE_KERNEL=0
export SCONE_HEAP=1073741824
export SCONE_STACK=4194304
export SCONE_CONFIG=/etc/sgx-musl.conf
export SCONE_ESPINS=10000
export SCONE_MODE=hw
export SCONE_SGXBOUNDS=no
export SCONE_VARYS=no
export SCONE_ALLOW_DLOPEN=yes (unprotected)
export SCONE_MPROTECT=no
Revision: d0afc0f23819476cbc7d944a20e91d79fcb6f9ab (Thu Aug 16 16:45:05 2018 +0200)
Branch: new-docker-images-cf (dirty)
Configure options: --enable-shared --enable-debug --prefix=/home/christof/GIT/subtree-scone/built/cross-compiler/x86_64-linux-musl

Enclave hash: 71e730d77fcae6fd37b80cd8669f2d75b8e58dbba80afa48929ae817bf263bb0
Warning message:
failed to set alternate signal stack

R version 3.5.0 (2018-04-23) -- "Joy in Playing"
Copyright (C) 2018 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

Example

Execute some first R program (taken from www.rexamples.com):

a <- 42
A <- a * 2  # R is case sensitive
print(a)
cat(A, "\n") # "84" is concatenated with "\n"
if(A>a) # true, 84 > 42
{
  cat(A, ">", a, "\n")
} 

This will result in an output:

84 > 42

Example 2

A somewhat more complex example from www.rexamples.com:

#utility functions

readinteger <- function()
{ 
  n <- readline(prompt="Enter an integer: ")
  if(!grepl("^[0-9]+$",n))
  {
    return(readinteger())
  }
  return(as.integer(n))
}

# real program start here

num <- round(runif(1) * 100, digits = 0)
guess <- -1

cat("Guess a number between 0 and 100.\n")

while(guess != num)
{ 
  guess <- readinteger()
  if (guess == num)
  {
    cat("Congratulations,", num, "is right.\n")
  }
  else if (guess < num)
  {
    cat("It's bigger!\n")
  }
  else if(guess > num)
  {
    cat("It's smaller!\n")
  }
}

This will result in an otherput as follows:

Enter an integer: 50
It's bigger!
Enter an integer: 75
It's bigger!
Enter an integer: 87
It's smaller!
Enter an integer: 82
It's smaller!
Enter an integer: 78
It's bigger!
Enter an integer: 80
It's bigger!
Enter an integer: 81
Congratulations, 81 is right.

Screencast