R:我应该给变量命名与函数参数同名吗?

时间:2018-10-10 19:19:41

标签: r object namespaces

我正在寻求有关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
# . . .

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

在非常简单的示例之外,将我的评论综合成一个答案,您绝对不应将变量的名称与函数参数相同。

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

示例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