обещание уже в стадии оценки: рекурсивная ссылка на аргумент по умолчанию или более ранние проблемы?



вот мой 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.) }, будет использовать одно и то же имя для формальных и фактические нефункциональные аргументы хорошая и безопасная практика или это может вызвать некоторые потенциальные проблемы?

552   2  
r

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

    Ничего не найдено.