r语言 - 将 Rmd 编织为 PDF 时 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)
```

您这里的问题是可重复性和未定义的变量。问题中的许多代码都不在代码块中,因此它将打印(尽管不是代码(,但不会创建变量、加载库等。考虑到这一点,您可能会意识到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"、空格、代码、反引号(使用内联代码。

最新更新