根据项目特定设置函数默认值 R
Posted
技术标签:
【中文标题】根据项目特定设置函数默认值 R【英文标题】:Setting Function Defaults R on a Project Specific Basis 【发布时间】:2012-02-22 20:09:19 【问题描述】:通常,我使用相同的功能设置。我想知道是否有一种方法,除了在路径中有一个本质上是函数包装器的新对象之外,可以设置默认参数。例如:
paste()
的sep
参数设置为空格=" "
,我厌倦了一遍又一遍地写,sep=""
。那么有没有办法用我选择的默认值“临时”替换该功能?
paste(...,sep="")
我可以通过包装来实现吗?我有时注意到,一些包会强制其他同名函数在全局环境中被屏蔽。
理想情况下,我希望可以在(load.r
或其他类似的工作流起点)中逐个项目地设置一些东西
【问题讨论】:
这个具体例子见R-devel中引入的paste0
。
同样,在这种特定情况下,ggplot2
具有 ps
,它将 paste
与 sep = ""
和 collapse = ""
包装在一起。虽然我一直认为对 ggplot2
的依赖对于那个实用函数来说有点多。
formals()
在基础 R 中,可以让您在不创建新函数的情况下设置默认值。见***.com/a/30416943/697473。
【参考方案1】:
Defaults 包曾经这样做过; 2014 年退休。
【讨论】:
目前有一个错误使setDefaults(paste, sep = "")
进入无限递归。杰夫现在正在解决这个问题。
Defaults 包已于 2014 年停用;自 R 3.0.x 以来未更新【参考方案2】:
我个人非常不愿更改任何常用函数的默认行为——尤其是基本 R 函数。一方面,它会立即降低使用重新定义函数的任何脚本或代码 sn-ps 的可移植性。更糟糕的是,阅读您的脚本的其他 R 用户可能会:(a) 不知道您对众所周知的语言元素的私人含义,或者 (b) 对不得不重新连接他们自己对功能的期望感到沮丧。对我来说,在不同的环境中为同一个符号附加不同的含义也会增加精神负担。
我认为好多更好的解决方案是创建类似命名的函数来实现您的首选默认值。稍加修改的名称将有效地标记这不是熟悉的基本功能,而不会给您带来太多或任何额外的输入负担。一个很好的例子是 gsubfn
包中包含的 paste0()
和 cat0()
函数。 (很明显,你和我并不是唯一(经常)对paste()
的默认sep
设置感到恼火的两个人!):
library(gsubfn)
paste0
# function (..., sep = "")
# paste(..., sep = sep)
# <environment: namespace:gsubfn>
cat0
# function (..., sep = "")
# cat(..., sep = sep)
# <environment: namespace:gsubfn>
然后,您可以在一个文本文件中收集这些函数,在脚本的早期获取它们,或者(更好地)将它们打包并通过调用 library()
加载它们。
【讨论】:
一个非常有效的考虑。这就是为什么我正在寻找便携的东西。其他人使用我的代码是非常罕见的。但仍然。 我认为您找到的任何合理解决方案都需要在脚本中至少添加 一个 行代码。恕我直言,它也可能是source("BBFuns.R")
或load(BBFuns)
,其中脚本文件或包包含您要使用的功能。为了简洁和便携性,很难击败它。那么调用修改后的函数是否有任何缺点,例如,paste0
而不是paste
?
+1 这就是我的做法,既适用于默认设置,也适用于我无法回忆的足够复杂的命令。另一个优点是,如果您有自己的包装器/帮助器函数,则可以通过在一处更改代码中的 all 实例的行为来轻松更改它。您还可以合并不同版本的功能,例如myPaste(..., ver = 2)
, myPaste(..., ver = 3)
.
functional::Curry
对于创建具有不同默认值的新函数非常有帮助。以上是关于根据项目特定设置函数默认值 R的主要内容,如果未能解决你的问题,请参考以下文章