如何设置图形设备的默认参数?

时间:2018-02-17 08:15:07

标签: r

我喜欢读黑色的白色。所以,在R中我会做一些事情:

par (bg = "black")
par (fg = "ivory1")

我希望默认情况下设置这些选项。但是,人们不会简单地在.Rprofile中写出这些行,因为据我所知,在执行它时,图形设备尚未初始化。相反,正如another answer中所建议的那样,应该重新分配options()$device以包含必要的选项设置。我没有成功。

这就是我的尝试:

~/.Rprofile

f_device <- options()$device

blackdevice <- function (...) {

    f_device(...)

    par (bg       = "black")
    par (fg       = "ivory1")
}

options (device = blackdevice)

这里的想法是将原始device函数保存到另一个变量,然后从我的新device函数中调用它。我得到的是:

Error in f_device(...) : could not find function "f_device"

- 当我运行plot (something)

我的另一个想法是这样:

~/.Rprofile

.First <- function () {

    options(f_device = options()$device)

    blackdevice <- function (...) {

        options()$f_device(...)

        par (bg       = "black")
        par (fg       = "ivory1")
    }

    options (device = blackdevice)
}

- 在device中的其他位置分配原始options。但这导致:

Error in (function (...)  : attempt to apply non-function

我没有想法。你能帮我搞清楚吗?

2 个答案:

答案 0 :(得分:13)

一个解决方案似乎是定义一个&#39; hook&#39;在创建新绘图时调用。来自plot.new的文档:

  

有两个钩子叫做'&#34; before.plot.new&#34;'和'&#34; plot.new&#34;'(见   'setHook')在推进框架之前和之后立即调用。   后者用于测试代码以注释新页面。该   没有参数调用钩子函数。 (如果值是a   字符串,'get'在'graphics'中被调用   命名空间。)

以下似乎有效:

setHook("before.plot.new", function(...) {
  par(bg = "black",
    fg = "ivory1",
    col.axis = "ivory1",
    col.lab = "ivory1",
    col.main = "ivory1",
    col.sub = "ivory1")
})

答案 1 :(得分:2)

此处的问题是,device选项尚未在.Rprofile处理时设置。
因此,此时options()$deviceNULL,这会导致您观察到的错误。

.First()函数也会在附加options("defaultPackages")的包之前执行,因此会出现同样的错误。

如果您想在.Rprofile中放置内容,则必须如下:

setHook(
    packageEvent("grDevices", "onLoad"),
    function(...) {
        f_device <- getOption("device")

        blackdevice <- function(...) {
            f_device(...)
            par(bg = "black")
            par(fg = "ivory1")
        }

        options(device = blackdevice)
    }
)

请注意这是标准R GUI的解决方案,但不适用于RStudio,后来设置了自己的"RStudioGD"设备 (并且要求grDevices已加载)。

(这也解释了在"RStudioGD"中重新定义.Rprofile以使其在搜索路径上超过"tools:rstudio"的尴尬方法(来自您关联的问题)