使用以R为基数的函数具有相同名称的变量名似乎通常被认为是糟糕的编程实践.

例如,很容易写:

data <- data.frame(...)
df   <- data.frame(...)

现在,函数data加载数据集,而函数df计算f密度函数.

类似地,人们也很容易写:

a <- 1
b <- 2
c <- 3

这被认为是糟糕的形式,因为函数c将组合其参数.

But:在计算线性模型的R函数lm中,data被用作参数.换句话说,datalm函数中成为显式变量.

So:如果R核心团队可以对变量和函数使用相同的名称,那么什么能阻止我们成为凡人呢?

答案并不是R会感到困惑.try 以下示例,其中我显式地分配了一个名为c的变量.R完全不会被变量和函数之间的差异所迷惑:

c("A", "B")
[1] "A" "B"

c <- c("Some text", "Second", "Third")
c(1, 3, 5)
[1] 1 3 5

c[3]
[1] "Third"

The question:使用与基R函数同名的变量到底有什么问题?

推荐答案

其实没有.在查找函数时,R通常不会搜索对象(非函数对象):

> mean(1:10)
[1] 5.5
> mean <- 1
> mean(1:10)
[1] 5.5
> rm(mean)
> mean(1:10)
[1] 5.5

@Joris和@Sacha所展示的例子就是糟糕的编码让你措手不及的地方.写foo的一个更好的方法是:

foo <- function(x, fun) {
    fun <- match.fun(fun)
    fun(x)
}

当使用时,它给出:

> foo(1:10, mean)
[1] 5.5
> mean <- 1
> foo(1:10, mean)
[1] 5.5

有些情况下,这会让你大吃一惊,@Joris的例子是na.omit,这是IIRC的一个例子,因为lm()中使用了标准的、非标准的判断.

一些答案也将TTRUE的问题与掩盖功能的问题混为一谈.因为TTRUE不是稍微超出@Andrie问题范围的函数.

R相关问答推荐

如何正确使用' programme::programme_bar$Message()'?

这两种创建S4对象的方法有何不同?

R的法国工作日

逐行替代引用前一行的for循环

使用gsim删除特殊词

如果窗口在CLARME或集团之外,则有条件领先/滞后滚动总和返回NA

在ggplot Likert条中添加水平线

如何自定义Shapviz图?

如何在modelsummary中重命名统计数据?

bslib::card_header中的shine::downloadButton,图标而不是文本

如何改变x轴比例的列在面

使用列/行匹配将两个不同维度的矩阵相加

提取一个列表中单个列的重复观察结果R

R中1到n_1,2到n_2,…,n到n_n的所有组合都是列表中的向量?

将选定的索引范围与阈值进行比较

来自程序包AFEX和amp;的类/函数和NICE_TABLE&冲突

如何对r中包含特定(未知)文本的行求和?

R仅当存在列时才发生变异

为什么将负值向量提升到分数次方会得到NaN

在同一单元格中创建包含整数和百分比的交叉表