
gsubfn is a package with one function, gsubfn, that
is like gsub except instead of taking a replacement
string it takes a replacement function.  For each
match, that match is passed to the replacement
function along with the backreferences, if any,
and replaced with the output of the function.
If the first two arguments are omitted the defaults
are set to do perl-style (sort of) string interpolation
as in last example.

# adds 1 to each number in third arg
# output: "(11 21)(101 31)" 
gsubfn("[[:digit:]]+", function(x) as.numeric(x)+1, "(10 20)(100 30)") 

# replaces pairs m:n with their sum
# output: "abc 30 def 70 50" 
f <- function(x,y,z) as.numeric(y)+as.numeric(z)
gsubfn("([0-9]+):([0-9]+)", f, "abc 10:20 def 30:40 50")

# extracts numbers from string and places them into vector v
# v becomes: 12 34 56 89 12
v <- c(); f <- function(x) v <<- append(v,as.numeric(x))
junk <- gsubfn("[0-9]+", f, "12;34:56,89,,12")
v

# makes all letters except first in word lower case
# output: "I Like A Banana Split" 
gsubfn("\\B.", tolower, "I LIKE A BANANA SPLIT")

# string interpolation (perl-style, somewhat)
# output: pi = 3.14159265358979, 2pi = 6.28318530717959
cat(gsubfn( , , "pi = $pi, 2pi = `2*pi`\n"))
