我试图学习编写可以重复使用的R代码,而不会在将来遇到问题,特别是由于我在我的函数中分配数据的名称与传递给函数的数据中的名称冲突。我没有看到任何处理此类事情的最佳做法。我正在寻找有关如何改进我正在做的事情的建议(或验证我所做的是最佳做法,但这似乎不太可能)。
我使用我的get_name()来获取数据中未使用的名称;然后我使用assign()将结果分配给该名称,以便我可以在更新的公式中使用它;然后我必须再次执行它并使用权限参数的get()。所有这些都是为了避免传入的数据/公式可能已包含我将使用的变量名称。
代码:
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
}
}