[問題] S3函數主、子函數參數繼承問題

作者: a78998042a (Benjimine)   2019-07-05 22:31:53
[問題類型]:
程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
[軟體熟悉度]:
使用者(已經有用R 做過不少作品)
[問題敘述]:
請教各位先進S3函數的寫法!有兩個問題。
需要功能:主函數有參數x,並依條件在內部以子函數改變x值,並取代主函數環境的x值
[程式範例]:
# 主函數
test_f = function(x, y, ...){
result = para_reset_f()
rm(list = c('x', 'y'))
attach(result)
return(sum(x, y))
}
# 子函數
para_reset_f = function(x = x, y = y){
if(x > 5) x = 100 else x = x
return(environment())
}
test_f(5, 10)
# 這個程式會造成
# Error in para_reset_f() :
# promise already under evaluation: recursive default
# argument reference or Earlier problems?"
想詢問較好的解法
候選解法1.
result = para_reset_f(x = environment()$x, y = environment()$y)
候選解法2.
environment(para_reset_f) = environment()
result = para_reset_f() ## 子函數參數改為全空
網路上的解法是
result = para_reset_f(x. = x, y. = y)
候選1看起來是最乾淨的,不過還沒有看過有官方函數是這樣寫的
應該是有其他參數引用的方式?
第二個問題是,我想將子函數的特定參數值取代主函數
所以我在para_reset_f 輸出環境
但為了要讓他蓋過主函數
我先 rm(list = c('x', 'y'))
再 attach(result)
這個寫法看來不太健康,想詢問是否有比較正確的解法!
謝謝!
[關鍵字]:
S3、參數繼承
作者: clickhere (It's time to go home.)   2019-07-06 10:10:00
S3用第一個參數作判別.如果沒有,你需要一個default函數或是給定,就像解法一.不要給x=x,y=y在param_reset_f中attach是盡可能避免的函數之一.可以在para_reset_f裡面直接`assign()`任何env的任何變數. assign('x', x, envir = parent.frame())return也可以免了, 必盡都要覆寫變數了.
作者: celestialgod (天)   2019-07-06 11:51:00
ls + assign +for
作者: clickhere (It's time to go home.)   2019-07-06 21:47:00
另一種做法是把envir當做para_rest_f的參數.直接在para_rest_f內用envir$x <- 100

Links booklink

Contact Us: admin [ a t ] ucptt.com