推 clickhere: S3用第一個參數作判別.如果沒有,你需要一個default函數 07/06 10:10
→ clickhere: 或是給定,就像解法一.不要給x=x,y=y在param_reset_f中 07/06 10:13
→ clickhere: attach是盡可能避免的函數之一. 07/06 10:14
→ clickhere: 可以在para_reset_f裡面直接`assign()`任何env的任何 07/06 10:15
→ clickhere: 變數. assign('x', x, envir = parent.frame()) 07/06 10:15
→ clickhere: return也可以免了, 必盡都要覆寫變數了. 07/06 10:17
謝謝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
→ celestialgod: ls + assign +for 07/06 11:51
→ clickhere: 另一種做法是把envir當做para_rest_f的參數. 07/06 21:47
→ clickhere: 直接在para_rest_f內用envir$x <- 100 07/06 21:48
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
→ clickhere: with是另一個盡可能避免的函數之一. 07/09 08:18