有没有办法从 R 中的另一个文件调用变量而不让它们出现在工作区中?

Is there a way to call variables from another file in R without having them appear in the workspace?

我有一个十六进制颜色列表,我想在 R 中为我的 graphs/tables 等使用这些颜色。

我写了一段代码,在脚本开头调用这些值。

col1 <- '#00573F'
col2 <- '#40816F'
col3 <- '#804B9F' 
col4 <- '#C0D5D0'
col5 <- '#A29161'

然后我在整个绘图时调用这些值,例如:

x <- seq(-pi, pi, 0.1)
plot(x, sin(x),
     main="The Sine Function",
     ylab="sin(x)",
     type="l",
     col=col1)

这非常有效。

但是,我想知道是否有一种方法可以将这些颜色变量作为一组标准变量存储在 R 中,而不必在每次启动新脚本时都调用这些变量?

此外,如果它们不作为值出现在环境中,那会很棒,因为这些颜色太多了,我很难跟踪其中的所有其他值。

许多人采用包作为编写 R 代码的默认方式,以实现这样的组织。

您可以使用准系统版本,我将在此处进行描述。

您需要一个 R/ 文件夹; dir.create("R")。 该目录不应包含脚本,而应包含独立的函数等,您可以在适当的时候采购它们。

你可以在其中创建一个 custom_colors 函数; file.edit("R/custom_colors.R")(这将在 RStudio 中打开一个文件)。添加:

custom_colors <- function(color_id) {
  c(
    col1 = '#00573F',
    col2 = '#40816F',
    col3 = '#804B9F',
    col4 = '#C0D5D0',
    col5 = '#A29161'
  )[color_id]
}

然后在任何需要它的地方,您可以编写 source("R/custom_colors.R") 让那个单一功能进入您的环境。

因此您可以调用 custom_colors(1) 而不是 col1

您可以将它们添加到您的 .Rprofile 作为列表或函数(如 Mossa 所建议的),R 将在每次启动时 运行。

请参阅 this post 了解如何找到您的 .Rprofile

要考虑的几个选项

为你的颜色常量开发一个内部包

我不会写包,但包可能包含任何 R 对象(不仅仅是函数和数据)。你可以开发一个内部包来保持你的颜色常量。如果你的包裹是names myInternals,你可以调用

x <- seq(-pi, pi, 0.1)
plot(x, sin(x),
     main="The Sine Function",
     ylab="sin(x)",
     type="l",
     col= myInternals::col1)

如果您有多个人需要访问您的常量,这就是我会采用的方法。这是一个更多的开销工作,但将常量分离到一个相对容易访问的单独环境中。

说实话,我现在工作的地方有一个使用@Mossa 策略的内部包。

使用'hidden objects'

如果您在对象前面加上 .,它不会出现在环境中的项目列表中(假设您使用的是 RStudio 窗格)

但是 运行 以下内容:

.col1 <- "#00573F"

# .col1 doesn't show up
ls()

# .col1 does show up
ls(all.names = TRUE)

x <- seq(-pi, pi, 0.1)
plot(x, sin(x),
     main="The Sine Function",
     ylab="sin(x)",
     type="l",
     col= .col1)

在我看来,这可能是最简单的,如果没有其他人需要访问我的常量,我会这样做。

使用列表

很像@Mossa 的回答,使用列表会将环境中显示的新对象数量减少到 1 个。

col_list <- list(col1 = '#00573F'
                 col2 = '#40816F'
                 col3 = '#804B9F' 
                 col4 = '#C0D5D0'
                 col5 = '#A29161')

x <- seq(-pi, pi, 0.1)
plot(x, sin(x),
     main="The Sine Function",
     ylab="sin(x)",
     type="l",
     col=col_env$col1)

使用环境

这也只是将一个对象添加到环境中,并将常量存储在当前环境之外。然而,使用它们与使用列表并没有太大区别,所以我不确定到底得到了什么。

col_env <- new.env()

assign("col1", "#00573F", col_env)

x <- seq(-pi, pi, 0.1)
plot(x, sin(x),
     main="The Sine Function",
     ylab="sin(x)",
     type="l",
     col=col_env$col1)