eval_fork: Safe Evaluation

View source: R/fork.R

eval_safeR Documentation

Safe Evaluation

Description

Evaluates an expression in a temporary fork and returns the value without any side effects on the main R session. For eval_safe() the expression is wrapped in additional R code to handle errors and graphics.

Usage

eval_safe(
  expr,
  tmp = tempfile("fork"),
  std_out = stdout(),
  std_err = stderr(),
  timeout = 0,
  priority = NULL,
  uid = NULL,
  gid = NULL,
  rlimits = NULL,
  profile = NULL,
  device = pdf
)

eval_fork(
  expr,
  tmp = tempfile("fork"),
  std_out = stdout(),
  std_err = stderr(),
  timeout = 0
)

Arguments

expr

expression to evaluate

tmp

the value of tempdir() inside the forked process

std_out

if and where to direct child process STDOUT. Must be one of TRUE, FALSE, filename, connection object or callback function. See section on Output Streams below for details.

std_err

if and where to direct child process STDERR. Must be one of TRUE, FALSE, filename, connection object or callback function. See section on Output Streams below for details. Non root user may only raise this value (decrease priority)

timeout

maximum time in seconds to allow for call to return

priority

(integer) priority of the child process. High value is low priority.

uid

evaluate as given user (uid or name). See setuid(), only for root.

gid

evaluate as given group (gid or name). See setgid() only for root.

rlimits

named vector/list with rlimit values, for example: c(cpu = 60, fsize = 1e6).

profile

AppArmor profile, see RAppArmor::aa_change_profile(). Requires the RAppArmor package (Debian/Ubuntu only)

device

graphics device to use in the fork, see dev.new()

Details

Some programs such as Java are not fork-safe and cannot be called from within a forked process if they have already been loaded in the main process. On MacOS any software calling CoreFoundation functionality might crash within the fork. This includes libcurl which has been built on OSX against native SecureTransport rather than OpenSSL for https connections. The same limitations hold for e.g. parallel::mcparallel().

Examples

# works like regular eval:
eval_safe(rnorm(5))

# Exceptions get propagated
test <- function() { doesnotexit() }
tryCatch(eval_safe(test()), error = function(e){
  cat("oh no!", e$message, "\n")
})

# Honor interrupt and timeout, even inside C evaluations
try(eval_safe(svd(matrix(rnorm(1e8), 1e4)), timeout = 2))

# Capture output
outcon <- rawConnection(raw(0), "r+")
eval_safe(print(sessionInfo()), std_out = outcon)
cat(rawToChar(rawConnectionValue(outcon)))
close(outcon)

jeroen/unix documentation built on Feb. 22, 2024, 12:52 p.m.