R 中函数参数的所有有效值

问题描述 投票:0回答:4

假设我们有一个 R 函数,其参数必须从有限的元素集中选择。就像

qplot(..., geom="")
。并且
geom
只能采用某些值,例如
bar
point

如何找出给定函数的参数可能采用的所有有效值?除了文档或互联网之外,它们经常会错过所有可能的值。也许一些 R 函数可以提供帮助?

r function arguments
4个回答
7
投票

如果感兴趣的函数定义如下

f <- function(a = c("foo","bar")) {
    match.arg(a)
}

即当选项定义为稍后使用

match.arg
函数检查的向量时,您可以使用
formals
函数,它会为您提供一个参数列表,其值如下例所示

> formals(f)
$a
c("foo", "bar")

否则我认为在没有 RTFSing 的情况下不可能获得所有有效的参数值。


0
投票

为了扩展 @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
 以及 
它调用的任何函数的内部逻辑。 所以不,没有通用的算法方法来获取某些参数的所有有效选项。当文档和互联网失败时,阅读源代码(作为人类)

是通用方法。


0
投票
特定

问题的答案可能是 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"            


0
投票

str(acf) function (x, lag.max = NULL, type = c("correlation", "covariance", "partial"), plot = TRUE, na.action = na.fail, demean = TRUE, ...)

© www.soinside.com 2019 - 2024. All rights reserved.