将Rmd编织为PDF时,knitr错误,但代码运行正常?

时间:2020-05-22 19:28:30

标签: r knitr

我正在尝试编织一个Rmd文件,并且代码运行正常,但是当我尝试编织时,一旦到达我的第一段R代码,我就会返回并出错:

Error in as.data.frame.default(x) : 
  cannot coerce class '"function"' to a data.frame
Calls: <Anonymous> ... merge.default -> merge -> as.data.frame -> as.data.frame.default
Execution halted

如果我删除了第一段代码,无论新的第一段代码是什么,都会弹出类似的错误。

编辑:这是我的第一个

 ---
title: "[title]"
author: "[Name]"
output:
  pdf_document: default
  word_document:
    fig_caption: yes
---


library(knitr)  
library(png) 

#The code book of the two data sets can be found in these two links:


wwwn.cdc.gov/Nchs/Nhanes/2015-2016/DEMO_I.htm  
wwwn.cdc.gov/Nchs/Nhanes/2015-2016/CBQ_I.htm  




install.packages("Hmisc")


library(Hmisc)

demo <- sasxport.get("https://wwwn.cdc.gov/Nchs/Nhanes/2015-2016/DEMO_I.XPT")

cbq <- sasxport.get("https://wwwn.cdc.gov/Nchs/Nhanes/2015-2016/CBQ_I.XPT")


`str(demo)`
`str(cbq)`


```{r}
eat <- merge(demo, cbq, by="seqn")
```



```{r}
dim(eat)
# = 52 columns
# = 9,971 rows

# OR can use
ncol(eat)
nrow(eat)
```

1 个答案:

答案 0 :(得分:1)

您的问题是可重复性和未定义的变量。问题中的大部分代码都不在代码块中,因此它将 print (尽管不是作为代码),但不会创建变量,加载库等。记住这一点,您可能会意识到那么democqb从未在文档中定义。

这意味着,如果任何一个在基础R环境中作为对象存在,则它们存在,但不是您认为的那样。在这种情况下,demo实际上是一个函数utils::demo并且可用,因此merge试图对此进行处理。不幸的是,如您所料,没有逻辑能够对函数执行类似合并的操作。

我可以在控制台上重现您的错误:

ls()
# character(0)

# 'demo' not defined as a frame, so still utils::demo
# 'cbq' does not matter, because 'merge' cannot get past the problem with 'demo'

merge(demo, cbq)
# Error in as.data.frame.default(x) : 
#   cannot coerce class '"function"' to a data.frame

解决方法可能是将您的初始代码放在代码块中。

我不知道您打算使用其中的URL做什么,但是这里的Rmd格式较为简单:

---
title: "[title]"
author: "[Name]"
output:
  pdf_document: default
  word_document:
    fig_caption: yes
---

The code book of the two data sets can be found in these two links:

- wwwn.cdc.gov/Nchs/Nhanes/2015-2016/DEMO_I.htm  
- wwwn.cdc.gov/Nchs/Nhanes/2015-2016/CBQ_I.htm  

```{r}
library(knitr)  
library(png) 
install.packages("Hmisc")
library(Hmisc)
demo <- sasxport.get("https://wwwn.cdc.gov/Nchs/Nhanes/2015-2016/DEMO_I.XPT")
cbq <- sasxport.get("https://wwwn.cdc.gov/Nchs/Nhanes/2015-2016/CBQ_I.XPT")
```

`str(demo)`

`str(cbq)`

```{r}
eat <- merge(demo, cbq, by="seqn")
```

```{r}
dim(eat)
# = 52 columns
# = 9,971 rows

# OR can use
ncol(eat)
nrow(eat)
```

关于此的一些注释:

  • 除非旨在始终在无菌的R环境(例如docker容器)中运行,否则我发现install.packages不仅设计不佳,而且对其他可能使用此功能的人也不公平Rmd文档:也许我打算保留一个稳定的较旧的软件包版本(可再现性!),但是仅通过呈现您的文档,我的软件包就被撤消了升级。

  • `str(demo)`以固定宽度的字体打印文字字符串"str(demo)",但是什么也没运行。这可能要么进入代码块,要么可以通过使用`r str(demo)`(即反引号,“ r”,空格,代码,反引号)来使用内联代码。

相关问题