Skip to content

options()$width ignored by print.formula

4 messages · Sarah Goslee, Brian Ripley

#
Hi all,

I'm working with summary.gam() and noticed that the options()$width
argument is ignored by some components of that function, in particular
the formula, which is printed at an arbitrary length regardless of the
desired width.

I've tracked the problem back to print.formula(), so at a lower level
than summary.gam(). Is there a way around this that I'm missing?

library(mgcv)
# start with example from ?gam
set.seed(2) ## simulate some data...
dat <- gamSim(1,n=400,dist="normal",scale=2)


colnames(dat)[1:5] <- c("reallylongnamey", "reallylongnamex0",
"reallylongnamex1", "reallylongnamex2", "reallylongnamex3")
b <- gam(reallylongnamey~s(reallylongnamex0)+s(reallylongnamex1)+s(reallylongnamex2)+s(reallylongnamex3),data=dat)

options(width=20)
b$formula # not wrapped to 20 characters

options(width=150)
b$formula # the formula is wrapped even though it fits in the specified width

# also true for lm()
b <- lm(reallylongnamey~reallylongnamex0+reallylongnamex1+reallylongnamex2+reallylongnamex3,data=dat)

options(width=20)
b$call

options(width=150)
b$call


Thanks,
Sarah

--
Sarah Goslee
http://www.functionaldiversity.org
#
On 06/11/2012 17:01, Sarah Goslee wrote:
Use deparse(): print() on a language type uses (at C level) deparse with 
the default width.cutoff of 60.  E.g. (subject to vagaries of mailers)

 > form <- 
reallylongnamey~reallylongnamex0+reallylongnamex1+reallylongnamex2+reallylongnamex3
 > form
reallylongnamey ~ reallylongnamex0 + reallylongnamex1 + reallylongnamex2 +
     reallylongnamex3
 > deparse(form, 150)
[1] "reallylongnamey ~ reallylongnamex0 + reallylongnamex1 + 
reallylongnamex2 + reallylongnamex3"

I am not sure this is something we would want to make depend on 
getOption("width"), but it might merit a separate option.

  
    
#
Thanks, Prof. Ripley.

Using deparse(b$formula, width.cutoff = options()$width) works as I'd
expected (full example below). So I can use that to write a custom
summary.gam(), though that still seems like a lot of work to get
summary(b) to follow the usual R output conventions.

Sarah

library(mgcv)
# start with example from ?gam
set.seed(2) ## simulate some data...
dat <- gamSim(1,n=400,dist="normal",scale=2)

colnames(dat)[1:5] <- c("reallylongnamey", "reallylongnamex0",
"reallylongnamex1", "reallylongnamex2", "reallylongnamex3")
b <- gam(reallylongnamey~s(reallylongnamex0)+s(reallylongnamex1)+s(reallylongnamex2)+s(reallylongnamex3),data=dat)

options(width=20)
deparse(b$formula, width.cutoff = options()$width) # not wrapped to 20
characters

options(width=150)
deparse(b$formula, width.cutoff = options()$width) # the formula is
wrapped even though it fits in the specified width


On Tue, Nov 6, 2012 at 12:37 PM, Prof Brian Ripley
<ripley at stats.ox.ac.uk> wrote:
--
Sarah Goslee
http://www.functionaldiversity.org
#
On 06/11/2012 17:54, Sarah Goslee wrote:
I think you are misreading the documentation.  ?options says

      ?width?: controls the maximum number of columns on a line used in
           printing vectors, matrices and arrays, and when filling by
           ?cat?.

           Columns are normally the same as characters except in CJK
           languages.

Nothing abut language objects there (nor the output from cat(), 
frequently used in print() methods without a 'fill' argument).

Contrast that with deparsing expressions, when 'width.cutoff' is a lower 
rather than upper bound, and is in bytes (not characters nor columns).

As I said, I can see a case from allowing the default cutoff used by 
print() to be under user control, but it would need to be a different 
option from 'width' since it is not even in the same units.