某些功能如browser
仅在交互使用时才有意义。
人们普遍认为subset
函数should only be used interactively。
同样,sapply
不适合程序化使用,因为它不会简化零长度输入的结果。
我正在努力制作一份详尽的功能列表,这些功能仅适用于程序化使用。
计划是制作一个包检查工具,看看是否有任何这些函数被调用并发出警告。
还有其他功能,如file.choose
和readline
需要交互性,但这些功能可以包含在包中,因为最终用途将是交互式的。我对这个用例并不太在意,但可以随意将它们添加到列表中。
我错过了哪些功能?
答案 0 :(得分:8)
(随意编辑。)
应谨慎处理以下功能(这并不一定意味着它们不适合 进行编程):
根据输入输出的输出类型不一致的函数:sapply
,mapply
(默认情况下)
内部行为因输入长度而异的函数:sample
,seq
评估环境中某些参数的函数:$
,subset
,with
,within
,transform
。
违反正常环境使用的功能:attach
,detach
,assign
,<<-
允许部分匹配的功能:$
仅在交互式使用中有意义的功能:browser
,recover
,debug
,debugonce
,edit
,fix
,menu
,select.list
与用户输入一起使用时可能成为威胁(病毒)的功能:source
,eval(parse(text=...))
,system
。
此外,在某种程度上,每个生成警告而不是错误的函数。我建议使用options(warn = 2)
将所有警告转换为编程应用程序中的错误。然后,可以通过suppressWarnings
或try
答案 1 :(得分:2)
这是对海报提问后的评论的回答。此函数输入一个函数并返回找到的有关其行号的错误函数。它可能会产生误报,但它们只是警告,所以这似乎并不太糟糕。修改bad
以适应。
badLines <- function(func) {
bad <- c("sapply", "subset", "attach")
regex <- paste0("\\b", bad, "\\b")
result <- sort(unlist(sapply(regex, FUN = grep, body(func), simplify = FALSE)))
setNames(result, gsub("\\b", "", names(result), fixed = TRUE))
}
badLines(badLines)
## sapply1 subset attach sapply2
## 2 2 2 4