【问题标题】:knit_expand fails when subsetting based on a character vectorknit_expand 在基于字符向量进行子集时失败
【发布时间】:2015-09-21 14:25:32
【问题描述】:

我实际上是在尝试修改 this answer 以编程方式为变量的每个级别生成带有图的块。

然而,在我的特殊情况下,我传递了一个字符向量以用于后续子集,这似乎是代码失败的根源。

# My report (test.Rmd)

```{r}
library(ggplot2)
library(knitr)
data(diamonds)
diamonds$cut <- factor(gsub(" ", "_", diamonds$cut)) # Get rid of spaces
cut.levels <- levels(diamonds$cut)
```

## Generate report for each level of diamond cut
```{r, include=FALSE}
src <- lapply(cut.levels, function(cut) knit_expand(file = "template.Rmd"))
```

`r knit(text = unlist(src))`

还有模板(template.Rmd):

```{r, results='asis', echo = FALSE}
cat("### {{cut}} cut")
```

```{r {{cut}}-cut, eval = FALSE}
with(subset(diamonds, cut == "{{cut}}"), 
     plot(carat, price, main = paste("{{cut}}", "cut"))
)

```

在将 template.Rmd 中的第二个块设置为 eval=FALSE 的情况下运行它会产生预期的输出 - 每个块的一系列标头以及回显的代码。但是,subset 调用中 cut.levels 字符串中的替换值丢失了引号,我预计这会在删除 eval=FALSE 块选项时导致以下错误:

Quitting from lines 6-8 (test.Rmd) 
Quitting from lines 12-12 (test.Rmd) 
Error in eval(expr, envir, enclos) : object 'Fair' not found
Calls: <Anonymous> ... with -> subset -> subset.data.frame -> eval -> eval

它现在正在寻找对象Fair,而不是那些带有cut == "Fair" 的记录。

感谢您的帮助!

> sessionInfo()
R version 3.2.1 (2015-06-18)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

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     

【问题讨论】:

    标签: r subset knitr


    【解决方案1】:

    我发现了 2 个问题。

    首先,正如您所指出的,{{cut}} 扩展时不带引号,因此您需要将标签括在引号中。其次,您对plot() 的关闭括号放错了位置。它应该运行以下编辑:

    ### {{cut}} cut
    
    ```{r {{cut}}-cut}
    with(subset(diamonds, cut == "{{cut}}"), 
         plot(carat, price, main = paste("{{cut}}", "cut"))
    )
    ```
    

    【讨论】:

    • 这很明显。谢谢@aaronwolen。虽然,现在只有第一个标题被识别为 html 文档中的实际标题。
    • 我通常迭代一个整数向量(与cut.levels的长度相同)并得到模板中字符向量的第i个位置。
    • 头部问题是在template.Rmd的第一个块中设置echo = FALSE的结果。标题与echo = TRUE 一样工作。我想知道是否有办法在不回显代码的情况下获取标题?
    • 当然。您实际上不需要在块中生成标头。我编辑了我的答案来演示,只需注意标题前应该有一个空格。
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 2020-10-27
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多