Mark Clements
Mark Clements

Reputation: 71

Using \Sexpr{} in LaTeX tabular environment

I am trying to use \Sexpr{} to include values from my R objects in a LaTeX table. I am essentially trying to replicate the summary output of a lm object in R because xtable's built in methods xtable.lm and xtable.summary.lm don't seem to include the Fstats, adjusted R-squared, etc (all the stuff at the bottom of the summary printout of the lm object in R console) So I tried accomplishing this by building a matrix to replicate the xtable.summary.lm output then construct a data frame of the relevant info for the extra stuff so I can refer to the values using \Sexpr{}. I tried doing this by using add.to.row to append the \multicolumn{} command in order to merge all columns of the last row of the LaTeX table and then just pass all the information I need into that cell of the table.

The problem is that I get an "Undefined control sequence" for the \Sexpr{} expression in the \multicolumn{} expression. Are these two not compatible? If so, what am I doing wrong and if not does anyone know how to do what I am trying to do?

Thanks,

Here is the relevant part of my code:

<<Test, results=tex>>=

model1 <- lm(stndfnl ~ atndrte + frosh + soph)

# Build matrix to replicate xtable.summary.lm output

    x <- summary(model1)
    colnames <- c("Estimate", "Std. Error", "t value", "Pr(<|t|)")
    rownames <- c("(Intercept)", attr(x$terms, "term.labels"))
    fpval <- pf(x$fstatistic[1],x$fstatistic[2], x$fstatistic[3], lower.tail=FALSE)
    mat1 <- matrix(coef(x), nrow=length(rownames), ncol=length(colnames), dimnames=list(rownames,colnames))

# Make a data frame for extra information to be called by \Sexpr in last row of table
    residse <- x$sigma
    degf <- x$df[2]
    multr2 <- x$r.squared
    adjr2 <- x$adj.r.squared
    fstat <- x$fstatistic[1]
    fstatdf1 <- x$fstatistic[2]
    fstatdf2 <- x$fstatistic[3]

    extradat <- data.frame(v1 = round(residse,4), v2 =degf, v3=round(multr2,4), v4=round(adjr2,4),v5=round(fstat,3), v6=fstatdf1, v7=fstatdf2, v8=round(fpval,6))   

    addtorow<- list()
    addtorow$pos <-list()
    addtorow$pos[[1]] <- dim(mat1)[1]
    addtorow$command <-c('\\hline \\multicolumn{5}{l}{Residual standard error:\\Sexpr{extradat$v1}} \\\\ ')

    print(xtable(mat1, caption="Summary Results for Regression in Equation  \\eqref{model1} ", label="tab:model1"), add.to.row=addtorow, sanitize.text.function=NULL, caption.placement="top")

Upvotes: 1

Views: 2724

Answers (1)

Aaron - mostly inactive
Aaron - mostly inactive

Reputation: 37754

You don't need to have Sexpr in your R code; the R code can use the expressions directly. Sexpr is not a LaTeX command, even though it looks like one; it's an Sweave command, so it doesn't work to have it as output from R code.

Try

addtorow$command <-paste('\\hline \\multicolumn{5}{l}{Residual standard error:',
                         extradat$v1, '} \\\\ ')

Also, no need to completely recreate the matrix used by xtable, you can just build on the default output. Building on what you have above, something like:

mytab <- xtable(model1, caption="Summary Results", label="tab:model1")
addtorow$pos[[1]] <- dim(mytab)[1]
print(mytab, add.to.row=addtorow, sanitize.text.function=NULL, 
             caption.placement="top")

See http://people.su.se/~lundh/reproduce/sweaveintro.pdf for an example which you might be able to use as is.

Upvotes: 2

Related Questions