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:
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)