我正在尝试学习编写可以重复使用的 R 代码,而不会预料到将来会出现问题,特别是由于我在函数中分配数据的名称与传递给函数的数据中的名称冲突。我没有看到任何处理此类事情的最佳实践记录在任何地方。我正在寻找有关如何改进我正在做的事情的建议(或验证我正在做的事情是最佳实践,但这似乎不太可能)。
我正在使用我的 get_name() 来获取数据中未使用的名称;然后我使用 assign() 将结果分配给该名称,以便我可以在更新的公式中使用它;然后我必须再做一次并将 get() 与 weights 参数一起使用。所有这些都是为了避免传入数据/公式可能已经包含我将使用的变量名称的可能性。
编码:
fgls_harvey = function(frml, data) {
reg = lm(frml, data)
en = get_name('_lresid2_', 'e', data)
assign(en, log(residuals(reg)^2))
f = update.formula(frml, reformulate('. + 0', en))
environment(f) = environment()
reg2 = lm(f, data)
exp_n = get_name('exppv', 'e', data)
assign(exp_n, exp(fitted(reg2)) / sum(fitted(reg2)))
environment(frml) = environment()
reg_fgls = lm(frml, data, weights=get(exp_n))
}
get_name = function(base, suffix, df) {
if ('data.frame' %in% class(df)) { # either a d.f-like object
names = colnames(df)
} else { # or an lm-like object
names = colnames(df$model)
}
if (base %in% names) {
get_name(sprintf('%s%s', base, suffix), suffix, df)
} else {
base
}
}