[R] character strings with embedded commands: perl "/gee" ?

ivo welch ivo.welch at anderson.ucla.edu
Sat Feb 9 20:03:19 CET 2013

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

estring <- function (e2)
  syntax <- regmatches(e2, gregexpr("(?<=\\{\\{).*?(?=\\}\\})", e2,
  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)

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.


On Fri, Feb 8, 2013 at 4:01 PM, ivo welch <ivo.welch at anderson.ucla.edu> wrote:
> dear R experts---I am trying to replicate a perl feature. I want to be
> able to embed R commands inside a character string, and have the
> string be printed with the command executed.  my perl equivalent is
>   my $a=10;
>   my $teststring = "the expression, $a+1, is ::$a+1::, but add one
> more for ::$a+2::\n";
>   $teststring =~ s/::(.*?)::/$1/gee;
>   print $teststring;
> of course, R does not use '$' for variable names.  my ultimate goal is
> to write something like
>   cat("d is a ::class(d):: with names ::names(d)::")
> of course, I know I can write this as cat("d is a", class(d), "with
> names", names(d)), but I also want to be define %or% so that I can
> write
>   (is.data.frame(d)) %or% "d is a ::class(d):: with names ::names(d)::" ;
> operators don't take variable arguments afaik.  :-(.
> advice appreciated.
> regards,
> /iaw
> ----
> Ivo Welch (ivo.welch at gmail.com)

More information about the R-help mailing list