【问题标题】:R: Should I name variables with the same name as function arguments? [closed]R:我应该用与函数参数相同的名称命名变量吗? [关闭]
【发布时间】:2018-10-10 19:19:41
【问题描述】:

我正在寻求有关 R 文档中演示的实践的指导,即创建与函数参数同名的变量,或为数据框及其列之一赋予相同的名称。后者可能导致这样的代码:

delay <- filter(delay(delay >= mean(delay)))

这让我感到困惑。

来自 data.frame {base} 帮助页面上的示例,fac = fac

(L3 <- LETTERS[1:3])
# "A" "B" "C"
(fac <- sample(L3, 10, replace = TRUE))
# "C" "C" "B" "A" "B" "A" "B" "A" "C" "C"
(d <- data.frame(x = 1, y = 1:10, fac = fac))
# x  y fac
# 1  1   C
# 1  2   C
# . . .

Refac = fac:用相同的名称命名多个对象/元素是否被认为是一种好习惯?这似乎可能令人困惑——我最初认为fac 是一个命名参数,然后去寻找它,但无济于事——但也许我错过了它的好处,而且这种方式实际上更简单。

【问题讨论】:

  • 基于意见。在我看来,分配与函数名称相同的对象名称是不好的做法。你只是在为自己和他人制造混乱。参数名称真的没那么重要。
  • @Rich Scriven,这是我的想法。对我来说,理解 bc 需要更长的时间,我试图弄清楚哪个是 arg,哪个是 df,哪个是 var。我试图弄清楚是否有充分的理由采用这种做法。如果不是,为什么 Hadley 等人以这些为例?
  • @RyanD,公平点。
  • 我认为这取决于。变量名的目的是提供关于存储值是什么的简洁信息。在factor(..., levels = levels) 的情况下,一个小例子可能就足够了,但是如果您有多个levels 向量,则需要更具体地命名它们。同样,read.csv(file) 是模棱两可的,而 read.csv(h20_temp_data) 不是。
  • @Mako212,关于通用示例的要点。然而,“非常清楚”,在旁观者的眼中。我的另一个例子(delaydelay,...)是从 Hadley 的 R4DS 书中略微修饰的,作为学习者,我的眼球在困惑中从同名对象跳到对象。我不清楚。但是您的观点可能是打算(对学习者)非常清楚!

标签: r object namespaces


【解决方案1】:

将我的 cmets 综合为答案,除了非常简单的示例之外,您绝对不应该将变量命名为与函数参数相同的名称。

良好的变量名称对于编写可读、可维护的代码至关重要。

示例 1(错误)

f1 <- read.csv(file = file, col.names = col.names) 

示例 2(良好)

h2o_data <- read.csv(file = h2o_temp_export, col.names = h2otemp_headers)

如果您没有编写示例 1 中的代码,则如果不阅读程序的其他部分或测试单独的代码行,则无法说明该代码行的作用。

在示例 2 中,即使您从未见过代码,您也会知道 h2o_data 包含来自 h2o_temp_export 的 .csv 数据,并且 col.names 已设置为此数据集特定的值。

现在假设您需要添加第二个数据集,按照示例 1,假设您有一个具有不同列的不同文件,您可能会这样写:

f2 <- read.csv(file1, col.names = col.names1) 

这完全是模棱两可的,没有告诉你任何关于 f1f2 的信息。更糟糕的是,您可以改写col.names,将其设置为f2 的新值,而不是使用col.names1

以下示例 2:

co2_data <- read.csv(file = co2_concentration_export, 
  col.names = co2_concentration_headers)

因此,除非您正在编写一个最小示例来突出显示一段代码的特定用途,例如那些 data.frame 示例,否则您应该始终为传递给函数的其他对象使用特定、有用的名称。

编辑:另见Hadley's Style Guide

【讨论】:

【解决方案2】:

这可能会导致麻烦,因为 R 会首先尝试从本地环境(函数环境内部)中获取,然后从全局环境中获取,这可能会导致意外的副作用。在风格上,我看到很多 R 程序员使用尾随下划线来区分参数和函数变量。即

distance = function (velocity_ = 0, time_ = 0){velocity_ * time_}
velocity = 10
time = 5
#Call the function
distance(velocity_ = velocity, time_ = time)

【讨论】:

  • @mrcasswary,区分参数和函数变量的有趣方式。在 python 中,尾随下划线是一种 PEP-8 约定,用于避免与 Python 关键字的命名冲突。然后将下划线附加到变量名而不是关键字。我似乎记得在 python 中,尾随下划线也可以表示计算值,但我现在似乎找不到确认。
  • [See here] (stackoverflow.com/questions/21075208/…) 这也发生在 r 中:尝试调用字母 -> 将某些内容分配给“字母”,然后再次调用字母。
猜你喜欢
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 2022-11-04
  • 1970-01-01
相关资源
最近更新 更多