拦截&使用点中捕获的可选变量的值(...)

时间:2014-12-21 22:22:58

标签: r parsing

我需要在函数中截取可选xlim的值,以便在绘图之前可以更改它的单位。以下函数确认已通过xlim,但我无法访问该值。

foo <- function(x, y, ...) {
    if ("xlim" %in% names(list(...))) {
        print(xlim) # not found/can't use value!
        }
    # modify xlim and pass to plotting functions
    return()
    }

但是foo(x = 1:5, y = 1:5, xlim = c(2,4))给出了:

Error in print(xlim) : object 'xlim' not found

我需要使用什么技巧?看起来它应该只是工作,但我从环顾四周看到点可以令人烦恼。我已经使用existsdeparse等进行了一些演奏,但我并没有真正做到这一点。正确使用这些功能。

编辑:所以这是最终片段,它是访问该值的最简单方法:

dots <- list(...)
if (any(names(dots) == "xlim")) {
    xlim <- dots$xlim
    print(xlim)
    }

1 个答案:

答案 0 :(得分:2)

这是因为xlim实际上是一个列表元素,并且(还)不是函数环境中的实际对象。你可以做到

foo <- function(x, y, ...) {
    m <- match.call(expand.dots = FALSE)$...
    if(any(names(m) == "xlim")) m[["xlim"]]
    else stop("no xlim value")
}
foo(x = 1:5, y = 1:5, xlim = c(2,4))
# c(2, 4)
foo(x = 1:5, y = 1:5, ylim = c(2,4))
# Error in foo(x = 1:5, y = 1:5, ylim = c(2, 4)) : no xlim value

如果我们将函数检查为

,您可以看到match.call正在做什么
f <- function(x, y, ...) {
    match.call(expand.dots = FALSE)$...
}

这是所有输入的点参数及其各自表达式的列表,因此有许多不同的方法来获取值,上面只是一种方式。

f(x = 1:5, y = 1:5, xlim = c(2,4))
# $xlim
# c(2, 4)

或者,您可以

g <- function(x, y, ...) {
    dots <- list(...)
    any(names(dots) == "xlim")
}
g(x = 1:5, y = 1:5, xlim = c(2,4))
# [1] TRUE

另请注意,match.call会将参数保留为未评估的call,而list(...)会对参数进行评估。这对于将参数传递给其他函数可能很重要。