Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Putting line number for R code with knitr

I wonder if there is any function to put line numbers with knitr in .Rnw. I found this discussion and some documents (now removed from the web) but could not find the way to put line numbers.

like image 974
MYaseen208 Avatar asked Dec 21 '14 20:12

MYaseen208


People also ask

How do I add line numbers in r?

To Generate Row number to the dataframe in R we will be using seq.int() function. Seq.int() function along with nrow() is used to generate row number to the dataframe in R. We can also use row_number() function to generate row index. We will also focus on generating row numbers by group with an example.

How do I show line numbers in RStudio?

These recommended settings are less confusing when learning R and RStudio. There are a few more editor settings that I personally find useful, so I click on “Code” in the sidebar, and then on the tab “Display”. I put ticks in the boxes in front of “Show line numbers” and “Show margin”.

How do you write an inline code in R Markdown?

A code chunk usually starts with ```{} and ends with ``` . You can write any number of lines of code in it. Inline R code is embedded in the narratives of the document using the syntax `r ` .

How do you use the knitr in RStudio?

If you are using RStudio, then the “Knit” button (Ctrl+Shift+K) will render the document and display a preview of it.


2 Answers

When using knitr with Lyx or Latex, I've found it helpful to add the lineno package to the document pre-amble and then to enclose the chunk with the \internallinenumbers \resetlinenumber[13].

Here's a minimal example:

\usepackage{lineno}

then in the body text, add the following before the code chunk:

{\internallinenumbers \resetlinenumber[13]

and then this after the code chunk:

}

With LyX (what I use for rapid LaTeX generation), I simply go to the document menu, then Settings->LaTeX Preamble and I add \usepackage{lineno}, click Apply, OK, and then Close. Then in the main document before my code chunk, I insert LaTeX source by clicking the "TEX" button menu button or by pressing "Ctrl+L" on the keyboard. Then I paste in {\internallinenumbers \resetlinenumber[13]. Finally, I place the cursor immediately after the code chunk and do the same thing. only I close the line numbering with a curly brace: }.

Here is a minimal example, when the code is in place is pasted below:

\documentclass[english]{article}
\usepackage{lineno}
\begin{document}
First line in main document before code chunk.

{\internallinenumbers \resetlinenumber[13]

<<CodeBlock1, highlight=TRUE, eval=FALSE, size="small">>=
x<-rnorm(10)
mean(x)
@
}
\end{document}
like image 133
StatsStudent Avatar answered Sep 18 '22 05:09

StatsStudent


This solution uses the LaTeX listings package to create line numbers. I can only get them to work by accumulating across all code chunks, but I imagine there is a similar solution that will enumerate lines only within each chunk. Here's the .Rnw source:

\documentclass{article}
\usepackage{listings}
\begin{document}

<<setup, echo=FALSE>>=
knit_hooks$set(source = function(x, options) {
    paste("\\begin{lstlisting}[numbers=left, firstnumber=last]\n", x, 
        "\\end{lstlisting}\n", sep = "")
})
@

<<a, results='hold'>>=
1:2
3:4
5:6
@

<<b>>=
"test1"
"test2"
"test3"
@

\end{document}

The key parts of this are in the source hook, which is basically copied from here. The firstnumber=last tells listings to accumulate line numbers across listings. Without it, all lines are numbered 1 because knitr is putting each code line in its own listing.

And here's the result:

enter image description here

If you want each code block to start numbering from 1, add a hook to reset the counter:

knit_hooks$set(reset = function(before, options, envir){
if(before){
    return("\\setcounter{lstnumber}{1}")
}
})

and then use reset=TRUE to activate the hook in each chunk you want:

<<a, results='hold', reset=TRUE>>=
1:2
3:4
@
like image 34
Thomas Avatar answered Sep 18 '22 05:09

Thomas