Daniel Fletcher
Daniel Fletcher

Reputation: 1244

How can I return compact head() and tail() results from the same code line with Rmarkdown/Knitr?

Goal: I want to return adjacent or at least compact results for head() and tail() using one line of code in Rmarkdown/Knitr.

I realize I can use c() for certain functions on the same code line and print on the same result line, e.g., c(mean(vector), sd(vector)) will return ## [1] 20.663 6.606.

However, if I try c(head(data), tail(data)) I get a list, instead of a matrix/df and if I use head(data); tail(data) the results will display contiguously(?) top/bottom in the R console but return only tail(data) results in Rmarkdown/Knitr.

Repro steps:

  1. Create an Rmd file with the following R chunk:

    ```{r Load Data, cache=TRUE,echo=TRUE}
    
    require("datasets") ## ensure User has the R datasets package installed
    data("ToothGrowth") ## load the ToothGrowth dataset
    head(ToothGrowth, n = 2); tail(ToothGrowth, n = 2) ## attempt compact results
    
    ```
    
  2. Ctrl+shift+k to knit the Rmd or otherwise select the Knit HTML action.

Relevant result:

    ##    len    supp dose
    ## 59 29.4   OJ    2
    ## 60 23.0   OJ    2

FYI settings:

sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] digest_0.6.4     evaluate_0.5.3   formatR_0.10     htmltools_0.2.4  knitr_1.6       
[6] rmarkdown_0.2.46 stringr_0.6.2    tools_3.0.2      yaml_2.1.11

Upvotes: 1

Views: 2252

Answers (4)

mpalanco
mpalanco

Reputation: 13570

Another option is the function headTail from the psych package. We pass ther argument ellipsis = FALSE so head and tail are not separated by dots.

library(psych)    
headTail(ToothGrowth, top = 2, bottom = 2, ellipsis = FALSE)

Output:

    len supp dose
1   4.2   VC  0.5
2  11.5   VC  0.5
59 29.4   OJ  2.0
60 23.0   OJ  2.0

Upvotes: 2

Ewen Gallic
Ewen Gallic

Reputation: 3

What if you add a column with row names?

library("datasets")
data("ToothGrowth")

# Add a leading column with row names
add_n_line <- function(df) {
  col_names <- colnames(df)
  df$n <- rownames(df)
  df[, c("n", col_names)]
}

print(cbind(add_n_line(head(ToothGrowth, n = 2)),
            add_n_line(tail(ToothGrowth, n = 2))),
      row.names = FALSE)

 ## n  len supp dose  n  len supp dose
 ## 1  4.2   VC  0.5 59 29.4   OJ    2
 ## 2 11.5   VC  0.5 60 23.0   OJ    2

Upvotes: 0

Bill Venables
Bill Venables

Reputation: 101

knitr seems to have a bug, (inherited from the evaluate package) and does not produce two printed results from expressions on the same line separated by semicolons.

The closes you might get to what you want could be using

> rbind(head(ToothGrowth, 2), tail(ToothGrowth, 2))
    len supp dose
1   4.2   VC  0.5
2  11.5   VC  0.5
59 29.4   OJ  2.0
60 23.0   OJ  2.0

Upvotes: 2

MYaseen208
MYaseen208

Reputation: 23898

Try something like this one

cbind(head(ToothGrowth, n = 2), tail(ToothGrowth, n = 2))

   len supp dose  len supp dose
1  4.2   VC  0.5 29.4   OJ    2
2 11.5   VC  0.5 23.0   OJ    2

Upvotes: 1

Related Questions