【问题标题】:Automated nicely formated book of lyrics from data.frame using markdown, knitr and glue使用markdown、knitr和glue从data.frame自动生成格式良好的歌词书
【发布时间】:2018-07-12 16:24:36
【问题描述】:

这是上一个问题的扩展:Automating the generation of preformated text in Rmarkdown using R。这是任务:

你有一个存储在data.frame中的歌词集合,其列是:歌词(每行末尾有很多\n)、歌曲标题、歌曲专辑、音乐作者、词作者、年等...

现在您想使用markdown(或bookdown)和glue 包自动生成格式精美的这首诗集,它们应该会生成这样的html:

<h1> Album name </h1>

<h2> Song name </h2>

<blockquote>
<cite>
Music: author_music <br>
Words: author_words
</cite>
<pre>
lyrics-line1
...
lyrics-lineN 
</pre>
</blockquote>

挑战在于,如果您使用来自Automating the generation of preformated text in Rmarkdown using R 的代码,它会将所有歌词打印为一长行: 歌词行\n...\n歌词行N

换句话说,有没有办法逐行打印歌词行(line\n ... \nlyrics-lineN),而不是一个连接的行?

此代码可用于获取要播放的歌词数据:

library(data.table); library(magrittr); library(knitr); library(stringr);library(dplyr)
dt <- fread("https://s3.amazonaws.com/assets.datacamp.com/blog_assets/prince_raw_data.csv")
dt <- dt[301:303,2:6] #take three songs only 
dt %>% names
dt %>% kable() # just to view the lyrics in your console.

注意:kable() 函数不会将 \n 替换为 &lt;br&gt;,我们希望这样做。
所以如果你用它来生成你的诗歌的 html,你会遇到同样的问题 - 而不是一个有很多行的诗句,你会得到一个很长的连接行。

PS。规避该问题的一种方法是将原始文本字符串拆分为许多单行字符串(例如,使用str_split(dt$text, '\n'),然后使用for 循环分别打印每一行。但应该有更好的打印诗句的方法,我希望。

【问题讨论】:

    标签: r markdown r-markdown knitr bookdown


    【解决方案1】:

    换句话说,有没有办法逐行打印歌词行(line\n ... \nlyrics-lineN),而不是一个连接的行?

    它是串联的,因为这是一个降价规则,每行末尾需要两个空格。

    我的解决方案是在 dt$text 周围添加原始 html 标签&lt;pre&gt; &lt;\pre&gt; 以保护它们不被 Markdown 语法解析:

    (不过我注意到&lt;pre&gt; 会将文本呈现为代码块,呃)

    ```{r echo=FALSE, results='asis'}
    for (i in 1:nrow(dt)){
      album = dt$album[i]
      song = dt$song[i]
      lyrics = dt$text[i]
    
      cat(glue::glue("# {album}\n\n"))
      cat(glue::glue("## {song}\n\n"))
      cat(glue::glue("<pre>{lyrics}</pre>"))
    }
    ```
    

    output

    source rmd

    或者,将\n 替换为\n(在\n 前插入两个空格),不带glue

    ```{r echo=FALSE, results='asis'}
    
    dt$text <- gsub("\n","  \n",dt$text)
    
    for (i in 1:nrow(dt)){
      cat(paste0("# ",dt$album[i],"\n\n"))
      cat(paste0("## ",dt$song[i],"\n\n"))
      cat(paste0("> ",dt$text[i]))
      cat("\n\n")
    }
    ```
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-13
      • 1970-01-01
      • 2016-02-01
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 2019-02-04
      相关资源
      最近更新 更多