在R中,我想编写一个用于更改绘图边距的函数,而不必强制总是输入所有边距。我认为替换子集将是最佳选择。但我无法弄清楚如何编写替换函数。
Mar <- function() par("mar")
`Mar<-` <- function (value) {
par(mar=value)
}
所以
Mar()[2:3] <- c(10, 5)
应该将边距更改为:
x <- par("mar")
x[2:3] <- value
par(mar=x)
获取值是好的
Mar()
[1] 5.1 4.1 4.1 2.1
但是尝试将结果设置为错误:
Mar()[2:3] <- c(10, 5)
Error in Mar()[2:3] <- c(10, 5) : invalid (NULL) left side of assignment
有什么想法吗?
好吧,正如Roland所指出的,我们没有S3类,所以我们不能覆盖[<-
函数。让我们适应:
Mar <- function() {
structure(par("mar"), class="mar")
}
`[<-.mar` <- function(x, ..., value){
cx <- oldClass(x)
class(x) <- NULL
x[...] <- value
class(x) <- cx
par(mar=x)
invisible(x)
}
这有效:
> par("mar")
[1] 5.1 4.1 4.1 2.1
> mm <- Mar()
> mm[2:3] <- c(10, 15)
> par("mar")
[1] 5.1 10.0 15.0 2.1
这不是:
> Mar()[2:3] <- c(8, 9)
Error in Mar()[2:3] <- c(8, 9) : invalid (NULL) left side of assignment
我错过了什么?
答案 0 :(得分:1)
使用[<-
完成子分配。你的方法无法运作。
这是另一种选择:
marassign <- function(direction, value) {
mar <- par("mar")
mar[direction] <- value
par(mar = mar)
}
marassign(2:3, 5)
par("mar")
#[1] 5.1 5.0 5.0 2.1