Partial function application in R
Sorry for not answering long. After working a lot with new version of "bind" function I find it actually really useful. Just to avoid any possible hard-to-debug errors I try to stick to some good practices, like always specifying default values for formal parameters and calling "bind" with named arguments only. And actually this feature reinvents http://www.nabble.com/Curry%3A-proposed-new-functional-rogramming%2C-er%2C-function.-td13535544.html#a13535544 :) I find myself operating a lot with list-of-lists-like structures, so this facility helps me really a lot. What about this one: combine <- function( ... ) { funs <- list( ... ) head <- funs[[1]] NULL -> funs[[1]] if( length(funs) > 0 ) function( ... ) do.call( combine, funs ) ( head( ... ) ) else head } It helps me to avoid lapplying multiple functions one after another, which was not really readable. Thus I came to writing code like this: sorting.predicate <- combine( pure.perf, bind( "[[", i="V11"), bind( quantile, 0.25 ) ) I wonder how bad is it? :) Regards, nosek
Wacek Kusnierczyk wrote:
nosek wrote:
Hello, soon after my last posting to this thread I stumbled upon the do.call function and came to the very much the same version as yours. It is good!
at least for the sort of tasks as in the examples below. but i haven't tested it beyond those, and in r you shouldn't rely on intuition.
However, it looks that both name clashes and mixing keyword and positional styles in argument binding and function calls may lead to very drastic and cryptic errors. Therefore I find this "functional" style of programming not too reliable yet.
would be interesting to see what sorts of very drastic and cryptic errors you get. not that i would be surprised if something intuitively correct does not if fact work. it might be a semantic weirdo, but it might be that you use the solution in a way obviously destined to failure. vQ
Wacek Kusnierczyk wrote:
czesc,
looks like you want some sort of currying, or maybe partial currying,
right? anyway, here's a quick guess at how you can modify your bind,
and it seems to work, as far as i get your intentions, with the plot
example you gave:
bind = function(f, ...) {
args = list(...)
function(...) do.call(f, c(list(...), args)) }
plotlines = bind(plot, type='l')
plotlines(1:10, runif(10))
plotredlines = bind(plotlines, col="red")
plotredlines(runif(10))
# careful about not overriding a named argument
plotredpoints = bind(plotredlines, type="p")
plotredpoints(runif(10))
you may want to figure out how to get rid of the smart y-axis title.
is this what you wanted?
pzdr,
vQ
______________________________________________ R-help at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.
View this message in context: http://www.nabble.com/Partial-function-application-in-R-tp21487269p22474710.html Sent from the R help mailing list archive at Nabble.com.