Hannes
2010-Jul-23 11:53 UTC
[R] model.tables call fails with "Error in inherits(object, "formula")"
Hello, I noticed that model.tables fails when applied to an aov() fit if called inside a function. The problem seems to occur when as.formula is used inside a function on a string containing "<formula> + Error( x / y )" The reason I tried to use as.formula is to generate dynamic calls to aov(). Here is a minimal example illustrating the problem: ## Example test <- function(dat) { frmlb <- "yield ~ block"; # WORKS aovfit <- aov(as.formula(frmlb), dat); print(model.tables(aovfit, "means")); frmlc <- "yield ~ block + Error(N/block)"; # DOES NOT WORK aovfit <- aov(as.formula(frmlc), dat); print(model.tables(aovfit, "means")); } utils::data(npk, package="MASS"); frmla <- "yield ~ block + Error(N/block)"; # WORKS aovfit <- aov(as.formula(frmla), npk); print(model.tables(aovfit, "means")); test(npk); ## End of example Output of sessionInfo(): R version 2.11.1 (2010-05-31) i386-pc-mingw32 locale: [1] LC_COLLATE=Finnish_Finland.1252 LC_CTYPE=Finnish_Finland.1252 [3] LC_MONETARY=Finnish_Finland.1252 LC_NUMERIC=C [5] LC_TIME=Finnish_Finland.1252 attached base packages: [1] stats graphics grDevices utils datasets methods base loaded via a namespace (and not attached): [1] tools_2.11.1 br Hannes G.
Prof Brian Ripley
2010-Jul-23 12:50 UTC
[R] model.tables call fails with "Error in inherits(object, "formula")"
The error message actually is Error in inherits(object, "formula") : object 'frmlc' not found and it is the omitted-by-you part after the colon that matters: the body of model.tables does not have 'frmlc' in its scope. Here is one approach to using dynamic formulae that works in a lot of similar situations: test <- function(dat) { frmlc <- as.formula("yield ~ block + Error(N/block)") aovfit <- eval(substitute(aov(form, dat),list(form=frmlc))) model.tables(aovfit, "means") } written without the pointless empty statements after the semicolons. On Fri, 23 Jul 2010, Hannes wrote:> Hello, > > I noticed that model.tables fails when applied to an aov() fit if called > inside a function. The problem seems to occur when as.formula is used inside > a function on a string containing > "<formula> + Error( x / y )" > > The reason I tried to use as.formula is to generate dynamic calls to aov(). > Here is a minimal example illustrating the problem:> ## Example > > test <- function(dat) { > frmlb <- "yield ~ block"; # WORKS > aovfit <- aov(as.formula(frmlb), dat); > print(model.tables(aovfit, "means")); > > frmlc <- "yield ~ block + Error(N/block)"; # DOES NOT WORK > aovfit <- aov(as.formula(frmlc), dat); > print(model.tables(aovfit, "means")); > } > > utils::data(npk, package="MASS"); > frmla <- "yield ~ block + Error(N/block)"; # WORKS > aovfit <- aov(as.formula(frmla), npk); > print(model.tables(aovfit, "means")); > test(npk); > > ## End of example > > > Output of sessionInfo(): > R version 2.11.1 (2010-05-31) > i386-pc-mingw32 > > locale: > [1] LC_COLLATE=Finnish_Finland.1252 LC_CTYPE=Finnish_Finland.1252 > [3] LC_MONETARY=Finnish_Finland.1252 LC_NUMERIC=C > [5] LC_TIME=Finnish_Finland.1252 > > attached base packages: > [1] stats graphics grDevices utils datasets methods base > > loaded via a namespace (and not attached): > [1] tools_2.11.1 > > br Hannes G. > > ______________________________________________ > 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. >-- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595