我正在撰寫一個包裝器函式,我在其中鏈接管道的多個步驟。我想這樣做,以便用戶可以輸入多個選項,如果存在則輸入該值,否則為默認值。
例如
orig_func1 <- function(num = 1, x=3, y=2){
num <- (x y)/num
return(num)
orig_func2 <- function(num = 1, z=5, w=23){
num <- (z - w)/num
return(num)
現在我想創建一個包裝器來執行每個指定的次數。我希望 num 隨著每次迭代而改變,作為下一個函式的輸入
wrapper <- function(
num = 1,
steps = list(c(step = NULL, x = NULL, y = NULL),
c(...),...){
for (i in 1:length(steps)){
if (steps[[i]]['step'] == "orig_func1"){
num <- orig_func1(num = num, x = steps[[i]][['x']], y = steps[[i]][['y']]
}
if (steps[[i]]['step'] == "orig_func2"){
num <- orig_func2(num = num, z = steps[[i]][['z']], y = steps[[i]][['z']]
}
}
例如,如果我嘗試運行它
test <- (
num = 1,
steps = list(c(step = orig_func1, x = 2, y = 5),
c(step = orig_func2, z = 4, w = 6),
c(step = orig_func1, x = 2) # I want default for y in this case
假設我嘗試運行此程式,同時將 y 留空以進行第三步,因為我想要默認值,這會引發錯誤,因為找不到 steps[[i]][['y']]。如果步驟串列中不存在而不重新指定包裝器中的默認值,我該如何制作它以便使用父函式的默認值?
uj5u.com熱心網友回復:
您的代碼不是特別清晰并且有很多錯誤,因此很難確切地看到您正在嘗試做什么 - 例如,您沒有在任何地方回傳您計算的數字,因此您的包裝函式的輸出將始終為 NULL。
我認為您嘗試做的事情可以通過使用base::do.call將引數作為串列提供而不是像您所做的那樣單獨提取它們來解決。
像這樣的東西:
wrapper <- function(num = 1,
steps = list()){
for (i in 1:length(steps)){
step_func <- steps[[i]][["step"]] # get function from 'step' element
step_args <- steps[[i]][-1] # remove 'step' element
num <- base::do.call(step_func, step_args) # call function with arguments
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/464583.html
上一篇:將數學運算從 反轉為-
