Это мои эмпирические правила:
Если значения по умолчанию можно вычислить из других параметров, используйте выражения по умолчанию, как в:
fun <- function(x,levels=levels(x)){
blah blah blah
}
, если в противном случае использовать отсутствующие
fun <- function(x,levels){
if(missing(levels)){
[calculate levels here]
}
blah blah blah
}
В редком случае, когда вы хотите указать значение по умолчанию, которое длится весь сеанс R, используйте getOption
fun <- function(x,y=getOption('fun.y','initialDefault')){# or getOption('pkg.fun.y',defaultValue)
blah blah blah
}
. Если некоторые параметры применяются в зависимости от класс первого аргумента, используйте S3 generic:
fun <- function(...)
UseMethod(...)
fun.character <- function(x,y,z){# y and z only apply when x is character
blah blah blah
}
fun.numeric <- function(x,a,b){# a and b only apply when x is numeric
blah blah blah
}
fun.default <- function(x,m,n){# otherwise arguments m and n apply
blah blah blah
}
Используйте ...
только при передаче дополнительных параметров на другую функцию
cat0 <- function(...)
cat(...,sep = '')
Наконец, если вы выбираете использование ...
, не передавая точки на другую функцию, предупреждайте пользователя о том, что ваша функция игнорирует любые неиспользуемые параметры, поскольку это может быть very запутанным иначе:
fun <- (x,...){
params <- list(...)
optionalParamNames <- letters
unusedParams <- setdiff(names(params),optionalParamNames)
if(length(unusedParams))
stop('unused parameters',paste(unusedParams,collapse = ', '))
blah blah blah
}
Попробуйте использовать not()
вместо !=
в предикате ...
<div id="gallery">
<div id="feature" >
<xsl:apply-templates select="image[@type='feature']"/>
</div>
<div id="thumbs">
<xsl:apply-templates select="image[not(@type='feature')]"/>
</div>
</div>