子集R的替换函数

时间:2016-08-10 09:49:03

标签: r function

在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

我错过了什么?

1 个答案:

答案 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