NSE 函数采用NSE输入。这就是这个模式的重点,不是吗?
subset2(mtcars, mpg > 31)
当然,您也可以允许 NSE 函数接受字符输入,但我强烈建议不要这样做。不要混合 SE 和 NSE,这没有任何优势,而且会造成混乱(以及潜在的错误,因为你正在混合领域)。
也就是说,以下方法当然有效:
subset2 <- function(df, condition) {
if (is.character(substitute(condition)))
subset2_(df, condition)
else
subset2_(df, lazy(condition))
}
如果出于向后兼容性的原因,您希望在同一功能中允许 NSE 和 SE,我建议在未来版本中逐步淘汰 SE 版本,并暂时添加弃用警告。添加弃用警告:
subset2 <- function(df, condition) {
if (is.character(substitute(condition))) {
msg = sprintf(paste0('Calling %s with a quoted expression is',
' deprecated. Pass an unquoted expression',
' instead, or use %s.'),
sQuote('subset2'), sQuote('subset2_'))
.Deprecated(msg = msg)
subset2_(df, condition)
}
else
subset2_(df, lazy(condition))
}