2

我正在 Rstudio 中编写一个 R 脚本,查看单个单元格数据并生成各种图表。我使用的包是ggplot2。当未加载 Seurat 库时,它会生成像这样的漂亮图形输出: 纯ggplot2图

然后,当 Seurat 库被导入时,该图恢复为这种丑陋:修拉干涉图 以下是 Seurat 引入的导入列表:

Imports: methods, ROCR, stringr, mixtools, lars, fastICA, tsne, Rtsne,
        fpc, ape, VGAM, pbapply, igraph, FNN, caret, plyr, dplyr,
        RColorBrewer, MASS, Matrix, irlba, reshape2, gridExtra, gplots,
        gdata, Rcpp, RcppEigen, RcppProgress, tclust, ranger

关于如何在不改变图形输出的情况下同时存在两个库的任何想法?

尝试过的解决方案:

  • 尝试“分离(”包:Seurat“,卸载=真)”//在关闭和重新加载RStudio时没有恢复绘图并且不允许上游代码块提供ggplot2正常图形。
4

1 回答 1

1

一条评论要求我发布我的修复作为答案,所以我做了一点挖掘。当您调用 后发生意外行为时library(package),那是因为该包有一个名为.onLoador的函数.onAttach。这些会在加载或附加包时自动运行,通常用于设置选项、打印有用的消息等。最佳实践表明您应该使用补码函数撤消任何操作,.onUnload. 见:https ://r-pkgs.org/r.html#when-you-do-need-side-effects

有时,包确实需要副作用。如果您的包与外部系统通信,这是最常见的——您可能需要在包加载时进行一些初始设置。...如果您使用 .onLoad(),请考虑使用 .onUnload() 来清除任何副作用。按照惯例,.onLoad() 和朋友通常保存在一个名为 zzz.R 的文件中。

所以我在 Github repo 中查找包Seurat,并没有看到任何ggplot2相关选项(https://github.com/satijalab/seurat/blob/master/R/zzz.R)。接下来是检查该包的DESCRIPTION,它向我显示了已加载Seurat使用的包。这是一个很长的列表,但我发现那里有一个有些常见的自定义图形包,cowplot. 如果你然后去那个仓库(https://github.com/wilkelab/cowplot/blob/master/R/setup.R):

.onAttach <- function(libname, pkgname) {
  # switch the default theme to theme_cowplot
  # ggplot2::theme_set(theme_cowplot())
  packageStartupMessage("\n********************************************************")
  packageStartupMessage("Note: As of version 1.0.0, cowplot does not change the")
  packageStartupMessage("  default ggplot2 theme anymore. To recover the previous")
  packageStartupMessage("  behavior, execute:\n  theme_set(theme_cowplot())")
  packageStartupMessage("********************************************************\n")
}

从这些消息中,您可以看到加载更改cowplot默认主题的情况ggplot2。出于好奇,我查看了提交以了解此更改何时发生在源头(尽管不是在将其推送到 CRAN 时):

https://github.com/wilkelab/cowplot/commit/158ccdfa45d6c3e99c8568afaa73f7d68cd6c9c2#diff-c9a33000e506e95bca8089aa91efd8b2

clauswilke 于 2018 年 3 月 29 日承诺

因此,截至大约一年前,这个问题不再是可重复的。但是,当发生意外行为时,此搜索过程可能对未来的读者仍然有用。


TL;博士:

ggplot2- 特定修复:原始默认主题是theme_gray(),因此如果您无法隔离影响代码的包,您始终可以手动将其添加到受影响的图中以恢复到以前的行为。

于 2019-11-30T03:19:46.013 回答