哪些R功能不适合程序化使用?

时间:2014-04-27 10:47:57

标签: r interactive

某些功能如browser仅在交互使用时才有意义。

人们普遍认为subset函数should only be used interactively

同样,sapply不适合程序化使用,因为它不会简化零长度输入的结果。

我正在努力制作一份详尽的功能列表,这些功能仅适用于程序化使用。

计划是制作一个包检查工具,看看是否有任何这些函数被调用并发出警告。

还有其他功能,如file.choosereadline需要交互性,但这些功能可以包含在包中,因为最终用途将是交互式的。我对这个用例并不太在意,但可以随意将它们添加到列表中。

我错过了哪些功能?

2 个答案:

答案 0 :(得分:8)

(随意编辑。)

应谨慎处理以下功能(这并不一定意味着它们不适合 进行编程):

  • 根据输入输出的输出类型不一致的函数:sapplymapply(默认情况下)

  • 内部行为因输入长度而异的函数:sampleseq

  • 评估环境中某些参数的函数:$subsetwithwithintransform

  • 违反正常环境使用的功能:attachdetachassign<<-

  • 允许部分匹配的功能:$

  • 仅在交互式使用中有意义的功能:browserrecoverdebugdebugonceeditfixmenuselect.list

  • 与用户输入一起使用时可能成为威胁(病毒)的功能:sourceeval(parse(text=...))system

此外,在某种程度上,每个生成警告而不是错误的函数。我建议使用options(warn = 2)将所有警告转换为编程应用程序中的错误。然后,可以通过suppressWarningstry

来允许特定情况

答案 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