特に、関数にデータを割り当てる名前が関数に渡されるデータの名前と競合するため、将来問題が発生することを予期せずに再利用できる 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
}
}