[問題] S3函數主、子函數參數繼承問題
[問題類型]:
程式諮詢(我想用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、參數繼承
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.204.236.87 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1562337125.A.53D.html
※ 編輯: a78998042a (180.204.236.87 臺灣), 07/05/2019 23:57:33
推
07/06 10:10,
5年前
, 1F
07/06 10:10, 1F
→
07/06 10:13,
5年前
, 2F
07/06 10:13, 2F
→
07/06 10:14,
5年前
, 3F
07/06 10:14, 3F
→
07/06 10:15,
5年前
, 4F
07/06 10:15, 4F
→
07/06 10:15,
5年前
, 5F
07/06 10:15, 5F
→
07/06 10:17,
5年前
, 6F
07/06 10:17, 6F
謝謝c大的說明與信件回復
para_reset_f = function(x, y){
if(x > 5) x <- 100
assign('x', x, envir = parent.frame())
NULL
}
另外想詢問,如果 para_reset_f 內部更改一堆參數
然後想要將 para_reset_f 環境內的所有參數輸出
有什麼撰寫建議嗎? 用assign n次
※ 編輯: a78998042a (180.204.236.87 臺灣), 07/06/2019 11:47:58
→
07/06 11:51,
5年前
, 7F
07/06 11:51, 7F
→
07/06 21:47,
5年前
, 8F
07/06 21:47, 8F
→
07/06 21:48,
5年前
, 9F
07/06 21:48, 9F
test_f = function(x, y, ...){
env = environment()
para_reset_f(x, y, env)
sum(x, y)
}
para_reset_f = function(x, y, env){
with(env, {
if(x > 5){
x <- 100
y <- 500
}})
}
好聰明! 這樣還少了assign的步驟
看起來簡潔有力,謝謝解說
※ 編輯: a78998042a (180.204.236.87 臺灣), 07/07/2019 01:06:42
發現了一個不解的問題
test_f = function(x, y, ...){
para_reset_f(5, 10, environment())
sum(x, y)
}
para_reset_f = function(g, b, env){
with(env, {
if(x > 5){
x = g + b
}})
}
test_f(50, 10)
# rror in eval(substitute(expr), data, enclos = parent.frame()) :
# 找不到物件 'g'
當 para_reset_f 內參數有其他預設參數時,我是找不到這些參數的
不知道是否有人能解惑!
※ 編輯: a78998042a (180.204.236.87 臺灣), 07/08/2019 22:48:33
→
07/09 08:18,
5年前
, 10F
07/09 08:18, 10F
R_Language 近期熱門文章
PTT數位生活區 即時熱門文章