Saptarshi Guha
2012-May-31 21:25 UTC
[R] Repost: Expressions returned by GlobalEnv functions and package functions
Hello, (Sorry for the repost, i am resending in plain text) I have a function 'ewrap' (see below for definition). It takes 3 expressions and returns another expression e.g. map <- ewrap({ len <- length(r$addon) rhcollect(len,1) }) becomes: expression({ NULL result <- mapply(function(.index, k, r) { { len <- length(r$addon) rhcollect(len, 1) } }, 1:length(map.values), map.keys, map.values) NULL }) attr(,"class") [1] "expression" "rhmr-map" ewrap is defined in the GlobalEnv. In my package (Rhipe), a function rhwrap has the exact same definition rhwap <- function(co1=NULL,before=NULL,after=NULL){ co <- substitute(co1); before=substitute(before) j <- as.expression(bquote({ .(BE) result <- mapply(function(.index,k,r){ .(CO) },1:length(map.values),map.keys,map.values) .(AF) },list(CO=co,BE=before,AF=after))) class(j) <- c(class(j),"rhmr-map") j } but the following two are different, map <- ewrap({ len <- length(r$addon) rhcollect(len,1) }) and map2 <- rhwrap({ len <- length(r$addon) rhcollect(len,1) }) (because serialize(map,NULL) != serialize(map2,NULL)) I guess this is because both functions(ewrap and rhwrap) return an environment in which they are defined and in the case of rhwrap this is the Rhipe package namespace/environment (i'm not sure what jargon i should use here). So my questions are: 1. how do i inspect the extra information that rhwrap is adding to its return value 2. How do i remove this, so that it behaves like ewrap Thanks in advance Saptarshi
Oliver Ruebenacker
2012-May-31 22:07 UTC
[R] Repost: Expressions returned by GlobalEnv functions and package functions
Hello Saptarshi, If two functions behave differently even though their definitions are identical, then it is because they refer to variables that were in scope when the functions were defined (i.e. lexical scoping). To prevent such differences, either define both functions in the same scope or have them read only arguments and local variables (i.e. pass all needed input variables as arguments). Take care Oliver On Thu, May 31, 2012 at 5:25 PM, Saptarshi Guha <saptarshi.guha at gmail.com> wrote:> Hello, > (Sorry for the repost, i am resending in plain text) > > I have a function 'ewrap' (see below for definition). > It takes 3 expressions and returns another expression e.g. > > map <- ewrap({ > ? ?len <- length(r$addon) > ? ?rhcollect(len,1) > ?}) > > becomes: > > expression({ > ? ?NULL > ? ?result <- mapply(function(.index, k, r) { > ? ? ? ?{ > ? ? ? ? ? ?len <- length(r$addon) > ? ? ? ? ? ?rhcollect(len, 1) > ? ? ? ?} > ? ?}, 1:length(map.values), map.keys, map.values) > ? ?NULL > }) > attr(,"class") > [1] "expression" "rhmr-map" > > ewrap is defined in the GlobalEnv. In my package (Rhipe), a function > rhwrap has the exact same definition > > rhwap <- ?function(co1=NULL,before=NULL,after=NULL){ > ?co <- substitute(co1); before=substitute(before) > ?j <- as.expression(bquote({ > ? ?.(BE) > ? ?result <- mapply(function(.index,k,r){ > ? ? ?.(CO) > ? ?},1:length(map.values),map.keys,map.values) > ? ?.(AF) > ?},list(CO=co,BE=before,AF=after))) > ?class(j) <- c(class(j),"rhmr-map") > ?j > } > > but the following two are different, > > map <- ewrap({ > ? ?len <- length(r$addon) > ? ?rhcollect(len,1) > ?}) > > and > > map2 <- rhwrap({ > ? ?len <- length(r$addon) > ? ?rhcollect(len,1) > ?}) > > (because serialize(map,NULL) != serialize(map2,NULL)) > > I guess this is because both functions(ewrap and rhwrap) return an > environment in which they are defined and in the case > of rhwrap this is the Rhipe package namespace/environment (i'm not > sure what jargon i should use here). > > So my questions are: > > 1. how do i inspect the extra information that rhwrap is adding to its > return value > 2. How do i remove this, so that it behaves like ewrap > > > Thanks in advance > Saptarshi > > ______________________________________________ > 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.-- Oliver Ruebenacker Bioinformatics Consultant (http://www.knowomics.com/wiki/Oliver_Ruebenacker) Knowomics, The Bioinformatics Network (http://www.knowomics.com) SBPAX: Turning Bio Knowledge into Math Models (http://www.sbpax.org)