修改函数内的点(...)

时间:2015-12-08 15:19:29

标签: r

我正在尝试修改自定义函数中的点(...)。以下是我的plot2函数的简化示例,该函数在屏幕上显示type="p"(默认值)并使用type="l"保存svg。当其中一个...绘图选项已在函数中时,问题就会浮出水面。在此示例中,"type"由多个实际参数匹配。

plot2 <-function(...){
plot(...) #visible on screen

svg("c:/temp/out.svg") #saved to file
plot(...,type="l")
dev.off()
}

#This works
plot2(1:10)
#This does not work because type is redefined
plot2(1:10, type="o")

我试图将点放在函数内部list并修改它,但plot不接受列表作为输入。

#Does not work
plot2 <-function(...){
plot(...)

dots <<-list(...)
print(dots)
if("type" %in% names(dots)) dots$type="l"
print(dots)

svg("c:/temp/out.svg")
plot(dots)
dev.off()
}
plot2(1:10, type="o")
Error in xy.coords(x, y, xlabel, ylabel, log) : 
  'x' is a list, but does not have components 'x' and 'y'

2 个答案:

答案 0 :(得分:12)

如果您要转发修改后的...版本,则需要做两件事:

  1. 捕获
  2. 通过do.call转发捕获的点。
  3. 其工作原理如下:

    plot2 = function (...) {
        # capture:
        dots = list(...)
    
        # modify:
        dots$type = 'l'
    
        # forward call:
        do.call(plot, dots)
    }
    

    通常,do.call(f, list(‹…›))相当于f(‹…›)

答案 1 :(得分:1)

对于您想要的,有一种更简单(更好)的方式,您无需触及...。通过明确定义需要特殊处理的参数,可以将它们从catch ...中取出。这也是一种理智的方法,更明确地说明了函数的作用(在其正式参数中)。以下是如何做到这一点:

plot2 <- function(x, type = "p", ...) {
  plot(x, type = type, ...) #visible on screen

  svg("out.svg") #saved to file
  plot(x, ..., type = "l")
  dev.off()
}

plot2(1:10)
plot2(1:10, type = "o")