循环在rmarkdown

时间:2018-01-17 18:14:22

标签: r loops for-loop r-markdown

我对r和rmarkdown比较新,所以如果这是一个愚蠢的问题,我会提前道歉。这是对更大数据集的简单复制。

我在数据框中有三列:

df <- data.frame( c(a, b), c(c, d), c(e, NA))
names(df) <- c("X", "Y", "Z")

我想在rmarkdown文件中显示它们,如下所示:

我喜欢b。

这是c

这是e

这是d

我写了一个包含

的函数
X <- 0
  for (i in 1:nrow(df)) {
  X[i] <- df$X[[i]] }

Y <- 0
  for (i in 1:nrow(df)) {
  Y[i] <- df$Y[[i]] }

X <- 0 
  for (i in 1:nrow(df)) {
  Z[i] <- df$Z[[i]] }

在markdown文件中(我正在努力争取的位)

I like `r X`    ### This is fine

``` {r}
for (i in 1:nrow(df)) {
  Y[i]
  Z[i] }        ### Doesn't work and I want to include text i.e. This is
```

我想做一些循环,所以它打印Y列Y的行1中的元素,然后是下一行等等,并跳过ifNA

任何帮助都将受到重视! :)

2 个答案:

答案 0 :(得分:-1)

首先,我会在你的第一个循环中给你一些提示。如果要将data.frame列传递给向量,可以对其进行向量化。我建议你check this later。因此,而不是:

X <- 0
 for (i in 1:nrow(df)) {
     X[i] <- df$X[[i]] }

尝试做:

X <- vector("numeric", nrow(df)) #suggestion to create a empty numerical vector
X <- as.numeric(df$X)

回答您的主要问题,您可以命名代码块以保持组织有序。如果您只需要输出而不是打印的代码,请使用eval=FALSE。现在,您有了向量,可以使用@jason建议:

I like `r X`


```{r code_chunk1, eval=FALSE}
paste0("This is ", X)
paste0("This is ", Y)
paste0("This is ", paste(Z,collapse = " ")) # if you want them all in the same line
}
```

避免使用操作员,它会产生意外结果并在您不注意的情况下产生问题! Visit this.

答案 1 :(得分:-1)

没有必要使用循环。但是,df的元素需要重新排列以按行打印。

下面的rmarkdown文件再现了预期的结果:

---
title: Loop in rmarkdown
output: html_document
---

```{r, echo=FALSE}
df <- data.frame( c("a", "b"), c("c", "d"), c("e", NA))
names(df) <- c("X", "Y", "Z")
```

I like `r df$X`

```{r, echo=FALSE, warning=FALSE}
library(magrittr)                  # use piping to improve readability
df[, 2:3] %>%                      # treat columns like a matrix
  t() %>%                          # change from row first to column first order
  as.vector() %>%                  # flatten into vector
  na.omit() %>%                    # drop NAs
  paste("This is", .) %>%          # Prepend text
  knitr::kable(col.names = NULL)   # print as table
```

输出为

enter image description here

请注意,knitr::kable(col.names = NULL)用于创建内联文本,即文本输出未包装在逐字记录元素中。

或者,可以使用块选项results='asis'

```{r, echo=FALSE, warning=FALSE, results='asis'}
library(magrittr)                              # use piping to improve readability
df[, 2:3] %>%                                  # treat columns like a matrix
  t() %>%                                      # change from row first to column first order
  as.vector() %>%                              # flatten into vector
  na.omit() %>%                                # drop NAs
  paste("This is", ., collapse = "  \n") %>%   # Prepend text and collapse into one string
  cat()                                        # use cat() instead of print()
```

请注意,\n之前的2个空格必须用于指示rmarkdown中的换行符。