我需要在函数中截取可选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
我需要使用什么技巧?看起来它应该只是工作,但我从环顾四周看到点可以令人烦恼。我已经使用exists
,deparse
等进行了一些演奏,但我并没有真正做到这一点。正确使用这些功能。
编辑:所以这是最终片段,它是访问该值的最简单方法:
dots <- list(...)
if (any(names(dots) == "xlim")) {
xlim <- dots$xlim
print(xlim)
}
答案 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(...)
会对参数进行评估。这对于将参数传递给其他函数可能很重要。