【问题标题】:Loop in rmarkdown在 rmarkdown 中循环
【发布时间】:2018-01-17 18:14:21
【问题描述】:

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

我在数据框中有三列:

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

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

我喜欢b。

这是c

这是电子

这是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]] }

并且在降价文件中(我正在努力解决的问题)

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 列第 1 行中的元素,然后是 Z,然后是下一行等,然后跳过 ifNA

任何帮助将不胜感激! :)

【问题讨论】:

  • y &lt;-c(1,2,NA,3); z&lt;-c(4,5,NA,6); print(paste("This is", paste(y[which(!is.na(y))],z[which(!is.na(z))],collapse=" ")));

标签: r loops for-loop r-markdown


【解决方案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.

【讨论】:

    【解决方案2】:

    没有必要使用循环。但是,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
    ```
    

    输出是

    请注意,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 中的换行符所必需的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      相关资源
      最近更新 更多