假设我们有一个 R 函数,其参数必须从有限的元素集中选择。就像
qplot(..., geom="")
。并且 geom
只能采用某些值,例如 bar
或 point
。
如何找出给定函数的参数可能采用的所有有效值?除了文档或互联网之外,它们经常会错过所有可能的值。也许一些 R 函数可以提供帮助?
如果感兴趣的函数定义如下
f <- function(a = c("foo","bar")) {
match.arg(a)
}
即当选项定义为稍后使用
match.arg
函数检查的向量时,您可以使用 formals
函数,它会为您提供一个参数列表,其值如下例所示
> formals(f)
$a
c("foo", "bar")
否则我认为在没有 RTFSing 的情况下不可能获得所有有效的参数值。
为了扩展 @Pavel Obraztcov 的出色答案(以及上面 @James 的评论),请以这个函数
f
为例:
f <- function(x) {
if(x == "foo") {
return("you said 'foo'")
} else if(x == "bar") {
return("you said 'bar'")
} else if(x == "xyz") {
stop("'xyz' is not a valid option")
}
}
(不一定是好函数,但没有什么可以阻止某人编写这样的函数。)
我们如何为参数
x
定义“有效值”?我们可以说有效值为 foo
、bar
和 xyz
,因为 f
显式处理这三个值。但仅仅编写一段代码来解析一系列简单的 if-else 语句显然是不够的;并非所有功能都是这样构造的。
并且
f
通过抛出错误来处理 xyz
,所以也许只有 foo
和 bar
是有效值?但在这种情况下,我们需要一段代码来检查 f
的内部逻辑并确定 xyz
总是会导致错误。这不是一个微不足道的任务 - 我不是 CS 专家,但我突然想知道“停止问题”是否会在这里发挥作用。
此外,f
对于
foo
、bar
和xyz
以外的值没有任何作用 - 在这种情况下这可能很糟糕,但是在某些情况下“返回某些内容”和“什么都不做”都是可以接受的(“有效”)结果?如果f
不直接处理
x
,而是将其传递给其他函数,事情会更糟。现在我们需要追踪 f
以及它调用的任何函数的内部逻辑。 所以不,没有通用的算法方法来获取某些参数的所有有效选项。当文档和互联网失败时,阅读源代码(作为人类)
是通用方法。
问题的答案可能是
apropos("^geom_") |> gsub(pattern = "geom_", replace = "")
但这是一个特殊情况:要知道这一点,您需要知道
qplot
(现已弃用)查找
geom_
函数:此内部代码行显示了它在做什么(g
是一个循环变量集到 geom
) 中的值:p <- p + do.call(paste0("geom_", g), params)
[1] "abline" "area" "bar"
[4] "bin_2d" "bin2d" "blank"
[7] "boxplot" "col" "contour"
[10] "contour_filled" "count" "crossbar"
[13] "curve" "density" "density_2d"
[16] "density_2d_filled" "density2d" "density2d_filled"
[19] "dotplot" "errorbar" "errorbarh"
[22] "freqpoly" "function" "hex"
[25] "histogram" "hline" "jitter"
[28] "label" "line" "linerange"
[31] "map" "path" "point"
[34] "pointrange" "polygon" "qq"
[37] "qq_line" "quantile" "raster"
[40] "rect" "ribbon" "rug"
[43] "segment" "sf" "sf_label"
[46] "sf_text" "smooth" "spoke"
[49] "step" "text" "tile"
[52] "violin" "vline"
str(acf)
function (x, lag.max = NULL, type = c("correlation", "covariance", "partial"), plot = TRUE, na.action = na.fail,
demean = TRUE, ...)