我正在尝试在R中创建一个函数,该函数以标准方式输出数据帧,但也允许用户拥有他认为必要的个性化列(目的是为古磁数据建立数据格式,对于这些信息,每个人都有共同的信息,而用户可能希望保留其格式的信息更加不寻常。
但是,我意识到,如果用户希望其数据的标头成为数据格式化函数已定义参数之一的前缀(例如,通过“ sheep”参数,则为“ sheepc”的前缀)自变量,请参见下面的示例),该函数将其解释为已定义的自变量(通过部分名称标识,有关更多详细信息,请参见http://adv-r.had.co.nz/Functions.html#lexical-scoping)。
是否有办法防止这种情况发生,或者至少向用户发出警告,说他不能使用该名称?
PS,我意识到这个问题类似于Disabling partial variable names in subsetting data frames,但我想避免使用我的函数的未来用户的选择。
fun <- function(sheeta = 1, sheetb = 2, sheepc = 3, ...)
{
# I use the sheeta, sheetb and sheepc arguments for computations
# (more complex than shown below, but here thet are just there to give an example)
a <- sum(sheeta, sheetb)
df1 <- data.frame(standard = rep(a, sheepc))
df2 <- as.data.frame(list(...))
if(nrow(df1) == nrow(df2)){
res <- cbind(df1, df2)
return(res)
} else {
stop("Extra elements should be of length ", sheep)
}
}
fun(ball = rep(1,3))
#> standard ball
#> 1 3 1
#> 2 3 1
#> 3 3 1
fun(sheep = rep(1,3))
#> Error in rep(a, sheepc): argument 'times' incorrect
fun(sheet = rep(1,3))
#> Error in fun(sheet = rep(1, 3)) :
#> argument 1 matches multiple formal arguments
答案 0 :(得分:3)
如果形式参数包含“ ...”,则仅部分匹配 应用于之前的参数。
fun <- function(..., sheeta = 1, sheetb = 2, sheepc = 3)
{<your function body>}
fun(sheep = rep(1,3))
# standard sheep
#1 3 1
#2 3 1
#3 3 1
当然,您的函数应该对非...参数进行断言检查(请参见help("stopifnot")
)。您还可以考虑在其标签中添加.
或_
,以减少发生名称冲突的可能性。
编辑:
“是否有可能在开始时没有...的情况下达到相同的效果?”
是的,下面是一个带有一个参数的简单示例:
fun <- function(sheepc = 3, ...)
{
stopifnot("partial matching detected" = identical(sys.call(), match.call()))
list(...)
}
fun(sheep = rep(1,3))
# Error in fun(sheep = rep(1, 3)) : partial matching detected
fun(ball = rep(1,3))
#$ball
#[1] 1 1 1