Hi the list, I am writing a function in which I need to affect a variable on a higher level. My fnction could be: ++++++++++++++++++ fooBis <- function(x){ nameObject <- deparse(substitute(x)) print(nameObject) assign(nameObject,4,envir=parent.frame()) }> fooBis(e)[1] "e"> e[1] 4 ----------------- (to simplify, this fnction can affect only the number 4. But it does it in the parent frame). My problem is that I use S4 programming. So the code becomes: +++++++++++++ setGeneric("foo",function(x){standardGeneric("foo")}) setMethod("foo","ANY", function(x){ nameObject <- deparse(substitute(x)) print(nameObject) assign(nameObject,4,envir=parent.frame()) } ) ----------- But it does not work since the definition of foo is now: +++++++++> foononstandardGenericFunction for "foo" defined from package ".GlobalEnv" function (x) { standardGeneric("foo") } <environment: 0x125b7c0c> ----------------- So how can I solve this problem? Is it possible to assign a value to a variable on the upper level using S4? Sincerely Christophe -- View this message in context: http://r.789695.n4.nabble.com/deparse-substitute-then-assign-in-a-S4-methods-tp4356748p4356748.html Sent from the R help mailing list archive at Nabble.com.
William Dunlap
2012-Feb-04 17:48 UTC
[R] 'deparse(substitute'))' then 'assign' in a S4 methods
Using substitute() and assign(..., envir=parent.frame()) in fooBis will lead you into a lot of trouble. It is nicer to use a 'replacement function', whose name ends with '<-', whose last argument is named 'value', and which returns the modified first argument. They are usually paired with extractor functions. E.g., > twice <- function(x, value) { 2*x } # 'extractor function' > `twice<-` <- function(x, value) { x <- value/2 ; x } # 'replacement function' > x <- 1:5 > twice(x) [1] 2 4 6 8 10 > twice(x)[2] <- 100 > x [1] 1 50 3 4 5 Your example, setting the input to a fixed value, could be `fooBis<-` <- function(x, value) { x <- 4 ; x } You would have to call it as an assignment: whatever is on the right side would be ignored x <- 20 fooBis(x) <- NULL # x should be 4 now There should not be any problem turning these into S4 generics in the usual way. Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com> -----Original Message----- > From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf Of cgenolin > Sent: Saturday, February 04, 2012 2:41 AM > To: r-help at r-project.org > Subject: [R] 'deparse(substitute'))' then 'assign' in a S4 methods > > Hi the list, > > I am writing a function in which I need to affect a variable on a higher > level. My fnction could be: > > ++++++++++++++++++ > fooBis <- function(x){ > nameObject <- deparse(substitute(x)) > print(nameObject) > assign(nameObject,4,envir=parent.frame()) > } > > fooBis(e) > [1] "e" > > e > [1] 4 > ----------------- > > (to simplify, this fnction can affect only the number 4. But it does it in > the parent frame). > > My problem is that I use S4 programming. So the code becomes: > > +++++++++++++ > setGeneric("foo",function(x){standardGeneric("foo")}) > setMethod("foo","ANY", > function(x){ > nameObject <- deparse(substitute(x)) > print(nameObject) > assign(nameObject,4,envir=parent.frame()) > } > ) > ----------- > But it does not work since the definition of foo is now: > > +++++++++ > > foo > nonstandardGenericFunction for "foo" defined from package ".GlobalEnv" > function (x) > { > standardGeneric("foo") > } > <environment: 0x125b7c0c> > ----------------- > So how can I solve this problem? Is it possible to assign a value to a > variable on the upper level using S4? > > Sincerely > Christophe > > > -- > View this message in context: http://r.789695.n4.nabble.com/deparse-substitute-then-assign-in-a-S4- > methods-tp4356748p4356748.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > 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.