Gabor Grothendieck <[EMAIL PROTECTED]> wrote:
        fn <- function(x,y) {
                assign(as.character(substitute(x)), "zz", sys.frame(-1))
                assign(as.character(substitute(y)), 3, sys.frame(-1))
        }
        fn(a,b)  # sets a to "zz" and b to 3
        
        "list2<-" <- function(x,y,value) {
                assign(as.character(substitute(y)), value[[2]], sys.frame(-1))
                value[[1]]
        }
        fn <- function()list("zz",3)
        a <- 1 # first arg must exist prior to invoking list2. Its value not important.
        list2(a,b) <- fn()
        
There is still another way, which doesn't use substitute, as.character, or
assign.  Instead of returning two results, accept an extra argument which
is a function that decides what to do with them.

    > f <- function(handler) { handler("zz", 3) }
    > f(function(x, y) { a <<- x; b <<- y })
    > a
    [1] "zz"
    > b
    [1] 3
    > g <- function() {
    +     u <- v <- NULL # make it clear these are local to g
    +     f(function(x,y) {u <<- x; v <<- y})
    +     list(u, v)  # see what we got
    + }
    > g()
    [[1]]
    [1] "zz"

    [[2]]
    [1] 3

Whenever I would have wanted to pass "a variable" to an R function,
this is what I do instead.  It works so well that I am still happily
ignorant of how to use substitute().  It's also much more compiler-friendly.

______________________________________________
[EMAIL PROTECTED] mailing list
https://www.stat.math.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html

Reply via email to