обещание уже в стадии оценки: рекурсивная ссылка на аргумент по умолчанию или более ранние проблемы?
вот мой R-код. Функции определяются как:
f <- function(x, T) {
10 * sin(0.3 * x) * sin(1.3 * x ^ 2) + 0.001 * x ^ 3 + 0.2 * x + 80
}
g <- function(x, T, f=f) {
exp(-f(x) / T)
}
test <- function(g=g, T=1) {
g(1, T)
}
запущенная ошибка:
тест -> ()
Ошибка в тесте() :
обещание уже в стадии оценки: рекурсивная ссылка на аргумент по умолчанию или более ранние проблемы?
если я подставлю определение f на g, то ошибка уходит.
мне было интересно, в чем ошибка? Как это исправить, если не заменить определение f на g? Спасибо!
обновление:
спасибо! Два вопроса:
(1) если функция test далее принимает аргумент за f, вы добавите что-то вроде test <- function(g.=g, T=1, f..=f){ g.(1,T, f.=f..) } ? В случаях с большим количеством рекурсий, это хорошая и безопасная практика добавления больше .?
(2) Если f является нефункциональным аргументом, например g <- function(x, T, f=f){ exp(-f*x/T) } и test <- function(g.=g, T=1, f=f){ g.(1,T, f=f.) }, будет использовать одно и то же имя для формальных и фактические нефункциональные аргументы хорошая и безопасная практика или это может вызвать некоторые потенциальные проблемы?
2 ответов:
формальные аргументы вида
x=xпричиной этому. Устраняя два случая, когда они происходят, мы получаем:f <- function(x, T) { 10 * sin(0.3 * x) * sin(1.3 * x^2) + 0.001 * x^3 + 0.2 * x + 80 } g <- function(x, T, f. = f) { ## 1. note f. exp(-f.(x)/T) } test<- function(g. = g, T = 1) { ## 2. note g. g.(1,T) } test() ## [1] 8.560335e-37
та же проблема, имя значения по умолчанию, в более простой функции:
f1=function(df1,tr=tr){ print(tail(tr)) } df1=data.frame() f1(df1) Error in tail(tr) : promise already under evaluation: recursive default argument reference or earlier problems?одно решение просто назначить
trконкретно:f1(df1,tr) nu_pregao cd_papel true_range pc_true_range mdTr13 sdTr13 mdTr21 sdTr21 70315 1781 AGRO3 0.25 0.019 0.01492308 0.005880215 0.01628571 0.006709269 70316 1781 AELP3 0.47 0.157 0.04223077 0.041219239 0.06061905 0.055112137 70317 1781 ADHM3 0.05 0.026 0.03469231 0.014912996 0.02976190 0.014542712 70318 1781 ABEV3 0.52 0.022 0.02176923 0.006610016 0.02204762 0.008639885 70319 1781 ABCB4 0.69 0.037 0.02838462 0.010444604 0.02585714 0.009456668 70320 1781 AALR3 0.71 0.042 0.02700000 0.010885771 0.02466667 0.010184956другое решение-просто изменить имя параметра:
f2=function(df1,tr1=tr){ print(tail(tr1)) } f2(df1) nu_pregao cd_papel true_range pc_true_range mdTr13 sdTr13 mdTr21 sdTr21 70315 1781 AGRO3 0.25 0.019 0.01492308 0.005880215 0.01628571 0.006709269 70316 1781 AELP3 0.47 0.157 0.04223077 0.041219239 0.06061905 0.055112137 70317 1781 ADHM3 0.05 0.026 0.03469231 0.014912996 0.02976190 0.014542712 70318 1781 ABEV3 0.52 0.022 0.02176923 0.006610016 0.02204762 0.008639885 70319 1781 ABCB4 0.69 0.037 0.02838462 0.010444604 0.02585714 0.009456668 70320 1781 AALR3 0.71 0.042 0.02700000 0.010885771 0.02466667 0.010184956Почему R не позволяет использовать то же имя для значения по умолчанию?
Comments