6

我总是以以下方式开始我的脚本:

rm(list=ls())

清除我的工作区以避免不同脚本之间的冲突。但是,我正在寻找一种方法来将所有更改的选项设置为默认状态。例如,在某些脚本中,我需要通过设置更改 SS 类型:

options(contrasts=c(unordered="contr.sum", ordered="contr.poly"))

在其他脚本中,我需要使用默认选项(因为它是默认选项,所以我不直接指定它),即:

options(contrasts=c(unordered="contr.treatment", ordered="contr.poly"))

但是如果之前刚刚使用了带有更改选项的脚本,那么该选项显然在我没有注意到的情况下发生了更改。

有没有我可以在我的脚本之上放置一个命令来将 R 重置为默认选项?

4

4 回答 4

10

就像@chl 所说,您可以将默认选项保存在某处,例如使用以下命令保存在Rdata文件中save

default_options = options()
save(default_options, file = "default_options.rda")

现在您可以从文件中加载这些默认值并应用它们:

load("default_options.rda")
options(default_options)

但是,我建议不要连续运行 R 脚本。相反,如果您在脚本之间共享功能,只需创建捕获该功能的函数。然后,您使用的脚本始终是独立的,不受其他先前运行的脚本的影响。然后,您设置的任何选项都是该脚本的本地选项,无需清空工作区或将选项设置为默认值。

请注意,我也从不保存我的工作环境,我总是使用原始数据和转换该原始数据的脚本来重建我的环境。如果有些部分需要花费大量时间,我会将它们放在一个单独的脚本中,最后Rdata使用save. 然后我将它们加载到主脚本中,使用load.

于 2013-04-11T11:09:21.577 回答
2

这是一个简单而优雅的单行代码不需要任何手动检索默认值:

default_opts <- callr::r(function(){options()}); options(default_opts)

这是如何工作的:

callr是 devtools 附带的一个包(所以如果你已经安装了 devtools,你就已经有了callr

callr::r只需启动一个后台进程,因此,我们可以检索默认选项options()并将它们返回到当前 R 会话

例子

# Default option
options("scipen")
# $scipen
# [1] 0

# Set to something else
options(scipen = 999)
# $scipen
# [1] 999

# Reset to defaults:
default_opts <- callr::r(function(){options()}); options(default_opts)


# Did it work? yes, the option is back to its default value
options("scipen")
# $scipen
# [1] 0
于 2020-07-26T19:24:22.267 回答
1

如果您使用 Rstudio 项目功能,您将立即摆脱所有问题。有关为什么应该避免使用 rm(list=ls()) 的更多详细信息,请参见https://www.tidyverse.org/articles/2017/12/workflow-vs-script/

于 2018-02-08T09:37:17.630 回答
0

人们普遍认为,以下将避免脚本之间的冲突。

rm(list=ls())

它不会。如果您不相信这一点,请尝试以下操作

library(dplyr)
library(raster)

rm(list = ls())

library(dplyr)

tibble::tibble(x = 1:10, y = 1:10) %>% 
  select(x)

选择应该来自 dplyr。但它来自光栅。原因?rm(list = ls())不会删除加载的库。

于 2020-07-26T19:42:34.577 回答