[问题] 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