【问题标题】:rmarkdown data.table plots don't match after compilationrmarkdown data.table 编译后绘图不匹配
【发布时间】:2018-12-06 01:02:48
【问题描述】:

我到处寻找答案,但我不确定这是否是一个错误,但我还没有发现任何远程类似的问题,所以这里是。

我(相对而言)是 R 中 data.table 库的新手,但它能够轻松地将内容应用于选择性查询而无需为所有内容创建函数,这让我在第一次使用它的那一刻就卖掉了。

我使用 rmarkdown 编译报告,并一直在 DT[i, j, by] 的 j 部分运行绘图。这在 Rstudio 中运行顺利,编辑器按照预期的方式执行我的代码,但是在我编译输出的那一刻,绘图不再符合我想要的(和看到的)!

我已经多次清理并重新启动了我的 Rsession,所以我知道这个问题不是由于我的 R 环境造成的。更奇怪的是,当我实际打印j 代码中的数据时,它们在输出和编辑器中都是相同的,所以plot 真的是搞砸了...

这是说明我的问题的 Rmd 代码:

---
title: "data.table plot issue"
author: "Anyone"
date: "27 juin 2018"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

## Building data

```{r}
library(data.table)

tab = data.table(varA = rep(1:4, each=5),
                 varB = rep(1:5, 4),
                 varC = rep(LETTERS[1:4], each=5),
                 varD = rep(c("red", "blue", "green", "hotpink"), each=5))
tab
```

```{r results="hold"}
layout(matrix(1:4, nrow = 2, byrow = T))
a = tab[,{

  print(varA)
  print(varB)
  print(varC)
  print(varD)

  plot(varB, varA, col=varD, ylim=c(0,5), pch=16, main=varC)

  }, by=varC ]
```

这是我在 Rstudio 中得到的(这是我应该得到的):

但是,这个是我编译后得到的:

打印的变量是正确的,所以我不知道这里有什么问题。我认为它与 Rmarkdown 编译以及它处理绘图的方式有关,但我没有太多工作要做。

有什么想法吗?


编辑:

版本信息:

  • R version 3.3.3 (2017-03-06)
  • knitr_1.20
  • rmarkdown_1.9

【问题讨论】:

  • 我可以重现问题,我的包版本是:rmarkdown_1.9、knitr_1.20和data.table_1.11.0。我正在运行:R version 3.5.0 (2018-04-23) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows >= 8 x64 (build 9200)
  • @Henrik 也许吧,但奇怪的是,这里我们得到了相反的效果(Rstudio 输出很好,而编译的却不是)

标签: r data.table r-markdown


【解决方案1】:

您可以通过用paste0包围颜色来强制颜色:

layout(matrix(1:4, nrow = 2, byrow = T))
a = tab[,{

  print(varA)
  print(varB)
  print(varC)
  print(varD)
  plot(varB, varA, col=paste0(varD), ylim=c(0,5), pch=16, main=varC)
  }, by=varC ]

【讨论】:

  • 是的,在这种情况下可以做到。不幸的是,绘图有问题的数据列取决于数据。在这个例子中,它是颜色和标题,但在我的一些报告中,绘图的实际点受到影响(它为所有绘图绘制相同的 y 值,并且颜色被正确分配)。我希望我不必为我所有的情节做这样的修复。感谢您的意见:)
  • 啊但是原理是一样的:力求值。例如,plot(varB, varA + 0, ...)
  • 分配变量不会导致评估吗?我尝试在测试期间执行A = varA 和plot(A, B, ...) 之类的操作
  • copy(varA) 将复制该值
  • 必须对所有地块进行此类修复@RomainB。我想这可能通常有效(我没有用你的例子进行测试):stackoverflow.com/a/44146260/1191259
猜你喜欢
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多