Thanks for all your help on this Duncan. Much appreciated! Regards Axel
On Tuesday, January 28, 2014, Duncan Murdoch <murdoch.dun...@gmail.com> wrote: > On 14-01-28 6:32 AM, Axel Urbiz wrote: > >> Hi, >> >> I've tried to put together a simpler example where I'm having the issue. >> >> I've built a foo package by only including a single .R file with the two >> functions listed below: trt and cmt. The second function calls the >> first. In the namespace file, if I only export(cmt), I get the following >> error message when running this >> >> library(foo) >> set.seed(1) >> dd <- data.frame(y = rbinom(100, 1, 0.5), treat = rbinom(100, 1, 0.5), x >> = rnorm(100), >> f = gl(4, 250, labels = c("A", "B", "C", "D"))) >> dd2 <- cmt(y ~ x + f + trt(treat), data =dd) >> > Error could not find function "trt" >> >> The problem is solved by doing export(cmt, trt) in the namespace. >> However, I'd like to avoid exporting trt and should not be required. >> Sorry I can't seem to figure this out by myself, and so I'd appreciate >> your help. >> > > You are asking for non-standard evaluation of the formula argument. You > want some parts of it to be evaluated in the global environment (f), some > parts in the dd dataframe (x), and some parts evaluated in the package > namespace (trt). R is flexible so this is possible, but it's not the way > that the terms function works, so you'll need to do more work yourself, > including specifying what the evaluation rules should be in case a variable > occurs in more than one of those locations. > > Duncan Murdoch > > >> Thanks, >> Axel. >> >> ---- >> >> #mycodefiles <- c("cmt.R") >> #package.skeleton(name = "foo", code_files = mycodefiles) >> #promptPackage("foo") >> >> #where cmt.R includes the code below: >> >> trt <- function(x) x >> >> cmt <- function(formula, data, subset, na.action = na.pass) { >> if (!inherits(formula, "formula")) >> stop("Method is only for formula objects.") >> mf <- match.call(expand.dots = FALSE) >> args <- match(c("formula", "data", "subset", "na.action"), >> names(mf), 0) >> mf <- mf[c(1, args)] >> mf$drop.unused.levels <- TRUE >> mf[[1]] <- as.name <http://as.name>("model.frame") >> special <- "trt" >> mt <- if(missing(data)) terms(formula, special) else terms(formula, >> special, data = data) >> browser() >> mf$formula <- mt >> mf <- eval.parent(mf) >> Terms <- attr(mf, "terms") >> attr(Terms, "intercept") <- 0 >> trt.var <- attr(Terms, "specials")$trt >> ct <- mf[, trt.var] >> y <- model.response(mf, "numeric") >> var_names <- attributes(Terms)$term.labels[-(trt.var-1)] >> x <- model.matrix(terms(reformulate(var_names)), >> mf, contrasts) >> intercept <- which(colnames(x) == "(Intercept)") >> if (length(intercept > 0)) x <- x[, -intercept] >> return(x) >> } >> >> >> >> >> On Mon, Jan 27, 2014 at 2:42 AM, Henrik Bengtsson <h...@biostat.ucsf.edu >> <mailto:h...@biostat.ucsf.edu>> wrote: >> >> On Sun, Jan 26, 2014 at 6:34 AM, Axel Urbiz <axel.ur...@gmail.com >> <mailto:axel.ur...@gmail.com>> wrote: >> > Hi Duncan, >> > >> > My most sincere apologies. It's really not my intention to waste >> anyones >> > time. More the opposite...for some reason I thought that the >> problem had to >> > do with my call to options() and thought that would be enough. >> Here's >> > something reproducible: >> > >> > I built a foo package based on the code under the "----" below. >> In the >> > namespace file, I've only exported: trt and cmt (not contr.none and >> > contr.diff). Notice that cmt calls contr.none and contr.diff by >> default. >> >> As a start, try to export everything, particularly 'contr.none' and >> 'contr.diff' and see if that works. Just a guess, but worth trying >> out. >> >> My $.02 >> >> /Henrik >> >> > >> > Then in R, I run this code and I get this error message: >> > >> > library(foo) >> > set.seed(1) >> > dd <- data.frame(y = rbinom(100, 1, 0.5), treat = rbinom(100, 1, >> 0.5), x = >> > rnorm(100), >> > f = gl(4, 250, labels = c("A", "B", "C", >> "D"))) >> > dd2 <- cmt(y ~ x + f + trt(treat), data =dd) >> >> Error in get(ctr, mode = "function", envir = parent.frame()) : >> > object 'contr.none' of mode 'function' was not found >> > >> > Thanks, >> > Axel. >> > >> > -------------------------------------------- >> > >> > trt <- function(x) x >> > >> > cmt <- function(formula, data, subset, na.action = na.pass, cts = >> TRUE) { >> > >> > if (!inherits(formula, "formula")) >> > stop("Method is only for formula objects.") >> > mf <- match.call(expand.dots = FALSE) >> > args <- match(c("formula", "data", "subset", "na.action"), >> > names(mf), 0) >> > mf <- mf[c(1, args)] >> > mf$drop.unused.levels <- TRUE >> > mf[[1]] <- as.name <http://as.name>("model.frame") >> > special <- "trt" >> > mt <- if(missing(data)) terms(formula, special) else >> terms(formula, >> > special, data = data) >> > mf$formula <- mt >> > mf <- eval.parent(mf) >> > Terms <- attr(mf, "terms") >> > attr(Terms, "intercept") <- 0 >> > trt.var <- attr(Terms, "specials")$trt >> > ct <- mf[, trt.var] >> > y <- model.response(mf, "numeric") >> > var_names <- attributes(Terms)$term.labels[-(trt.var-1)] >> > treat.names <- levels(as.factor(ct)) >> > oldcontrasts <- unlist(options("contrasts")) >> > if (cts) >> > options(contrasts = c(unordered = "contr.none", ordered = >> "contr.diff")) >> > x <- model.matrix(terms(reformulate(var_names)), >> > mf, contrasts) >> > options(contrasts = oldcontrasts) >> > intercept <- which(colnames(x) == "(Intercept)") >> > if (length(intercept > 0)) x <- x[, -intercept] >> > return(x) >> > } >> > >> > ####################################### >> > # An alternative contrasts function for unordered factors >> > # Ensures symmetric treatment of all levels of a factor >> > ####################################### >> > contr.none <- function(n, contrasts) { >> > if (length(n) == 1) >> > contr.treatment(n, contrasts = n<=2) >> > else >> > contr.treatment(n, contrasts = length(unique(n))<=2) >> > } >> > >> > ####################################### >> > # An alternative contrasts function for ordered factors >> > # Ensures use of a difference penalty for such factors >> > ####################################### >> > contr.diff <- function (n, contrasts = TRUE) >> > { >> > if (is.numeric(n) && length(n) == 1) { >> > if (n > 1) >> > levs <- 1:n >> > else stop("not enough degrees of freedom to define contrasts") >> > } >> > else { >> > levs <- n >> > n <- length(n) >> > } >> > contr <- array(0, c(n, n), list(levs, paste(">=", levs, sep=""))) >> > contr[outer(1:n,1:n, ">=")] <- 1 >> > if (n < 2) >> > stop(gettextf("contrasts not defined for %d degrees of >> freedom", >> > n - 1), domain = NA) >> > if (contrasts) >> > contr <- contr[, -1, drop = FALSE] >> > contr >> > } >> > >> > >> > >> > On Sun, Jan 26, 2014 at 1:21 PM, Duncan Murdoch >> <murdoch.dun...@gmail.com <mailto:murdoch.dun...@gmail.com>>wrote: >> > >> >> On 14-01-25 6:05 PM, Axel Urbiz wrote: >> >> >> >>> Thanks again all. Essentially, this is the section of the code >> that is >> >>> causing trouble. This is part of the (exported) function which >> calls >> >>> contr.none (not exported). As mentioned, when I call the >> exported function >> >>> it complains with the error described before. >> >>> >> >>> >> >>> oldcontrasts <- unlist(options("contrasts")) >> >>> if (cts) >> >>> options(contrasts = c(unordered = "contr.none", ordered >> = >> >>> "contr.diff")) >> >>> x <- model.matrix(terms(reformulate(var_names)), mf, >> contrasts) >> >>> options(contrasts = oldcontrasts) >> >>> >> >> >> >> This is hugely incomplete. Please stop wasting everyone's time, >> and post >> >> something reproducible. >> >> >> >> Duncan Murdoch >> >> >> >> >> > >> > [[alternative HTML version deleted]] >> > >> > ______________________________________________ >> > R-devel@r-project.org <mailto:R-devel@r-project.org> mailing list >> > https://stat.ethz.ch/mailman/listinfo/r-devel >> >> >> > [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel