使用 R,如何通过 getPar 和 setPar 访问 par() 的内部结构
Using R, how to getPar and setPar to access the guts of par()
我正在为 R 中的 par()
选项开发一些通用访问器函数。
getPar
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
函数中运行的解决方案。可变方法。
对列表的赋值(即 [<-
和 [[<-
)需要在赋值的 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
我正在为 R 中的 par()
选项开发一些通用访问器函数。
getPar
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
函数中运行的解决方案。可变方法。
对列表的赋值(即 [<-
和 [[<-
)需要在赋值的 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