Skip to content
Prev 317215 / 398503 Next

character strings with embedded commands: perl "/gee" ?

joshua wiley told me how to do this.  so, here is something I find quite useful:



estring <- function (e2)
{
  syntax <- regmatches(e2, gregexpr("(?<=\\{\\{).*?(?=\\}\\})", e2,
perl=TRUE))[[1]]
  res <- lapply(syntax, function(p) eval(parse(text=p)))
  res <- lapply(1:length(res), function(i) {
    e2 <<- gsub(paste0("{{", syntax[i], "}}"), res[i], e2, fixed=TRUE)
  })
  e2
}

abort.estring <- function(s) abort(estring(s))

abort <- function (...) {
   cat(..., file=stderr)
   stop(simpleError("Aborting --- use options(error=recover) and
traceback() for debugging\n")
}
die <- abort

`%or%` <- function(e1, e2) { if (!e1) { if (is.character(e2))
abort.estring(e2) else eval(e2) }}
`%and%` <- function(e1, e2) { if (e1) { if (is.character(e2))
abort.estring(e2) else eval(e2) }}


together, this is useful for such constructs as

f <- function(a1) {
   (is.data.frame(a1)) %or% "a1 is not a data frame but a {{class(a1)}}"
   (exists("column", a1)) %or% "sorry, but column named 'column' does
not exist.  choose from {{names(a1)}} instead"
   (is.numeric(a1$column)) %or% "column a1 is not numeric"
}

I also find it useful to have an optional length argument for
is.numeric or is.character, which requires the argument to be of
length x, but this is another story.

/iaw
On Fri, Feb 8, 2013 at 4:01 PM, ivo welch <ivo.welch at anderson.ucla.edu> wrote: