如何使用getPar和setPar访问par()的核心内容

k7fdbhmy  于 2023-03-15  发布在  其他
关注(0)|答案(1)|浏览(131)

我正在为R中的par()选项编写一些通用的访问器函数。

获取参数

getPar = function(key)
    {
    par()[[key]];   
    }

这按预期工作。

getPar("mar");

设置参数

# save memory ... restoreState ... pdf 
setPar = function(key, val)
    {
    # par(mar=c(0.25, 0.25, 0.25, 0.25)
    # R.O. indicates read-only arguments: These may only be used in queries and cannot be set. ("cin", "cra", "csi", "cxy", "din" and "page" are always read-only.)
    # https://www.rdocumentation.org/packages/graphics/versions/3.6.2/topics/par
    pnames = names( par(no.readonly = TRUE) );
    if(is.element(key, pnames))
        {
        par()[[key]] = val;
        }
    }

这个不起作用:

mar = c(0.25, 0.25, 0.25, 0.25);
setPar("mar", mar);

并引发错误:

Error in par()[[key]] = val : invalid (NULL) left side of assignment

关于如何编写上面列出的setter函数,您有什么想法吗?
是的,我明白了,我可以直接传递par(mar = c(0.25, 0.25, 0.25, 0.25))来“设置”值。我正在寻找一个可以在这个简单的setter函数中工作的解决方案。一个可变参数的方法。

wooyq4lh

wooyq4lh1#

对列表的赋值(即[<-[[<-)需要赋值的LHS上的 object,而不是产生列表的表达式。

A <- list(a=1)
A$b <- 2
A
# $a
# [1] 1
# $b
# [1] 2
list(a=1)$b <- 3
# Error in list(a = 1)$b <- 3 : 
#   target of assignment expands to non-language object

我建议您将setPar更改为实际使用par设置值,而不是尝试对列表进行操作。

setPar = function(key, val)
    {
    # par(mar=c(0.25, 0.25, 0.25, 0.25)
    # R.O. indicates read-only arguments: These may only be used in queries and cannot be set. ("cin", "cra", "csi", "cxy", "din" and "page" are always read-only.)
    # https://www.rdocumentation.org/packages/graphics/versions/3.6.2/topics/par
    pnames = names( par(no.readonly = TRUE) );
    if(is.element(key, pnames))
        {
        par(setNames(list(val), key))
        }
    }

par("mar")
# [1] 5.1 4.1 4.1 2.1
setPar("mar", 1:4)
par("mar")
# [1] 1 2 3 4

相关问题