gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:31:27 25 4
gpt4 key购买 nike

我需要截取函数中可选的 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)
}

最佳答案

这是因为 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(...) 评估参数.这对于您将参数传递给其他函数可能很重要。

关于r - 拦截并使用点中捕获的可选变量的值 (...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27594394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com