如何隨機地決定R程序的運行先後順序?
比方說我有五個函數,然後我想不斷循環運行,每次隨機地確認他們的運行先後順序。函數能夠存成array的形式就好了。。。
裝入list就好了
# 定義函數
f1 &<- function(){
print(f1)
}
f2 &<- function(){
print(f2)
}
f3 &<- function(){
print(f3)
}
f4 &<- function(){
print(f4)
}
f5 &<- function(){
print(f5)
}
funList &<- list(f1 = f1,
f2 = f2,
f3 = f3,
f4 = f4,
f5 = f5)
#lapply(ceiling(runif(100,min = 1,max = 5)), function(i) funList[[i]]())
#謝謝Allen指出
lapply(sample.int(5,5), function(i) funList[[i]]())
用 function list 的解法假設只有當前 environment 里的這幾個 function 是需要隨機決定順序的,而沒有考慮 argument 和 environment 也可能對每一次 call 都不同。另一個可能的 bug 是在建立 funList 的時候你的 function 被 copy 了一次存在了 list 里,而你原來的 function 本身還在你的 workspace 或其他 environment 里。這時如果你修改並 source 了某個 function 而忘記 update 你的 funList,就會執行你之前的 function。這相當於你要同時維護一個 function 的兩個 copy。
f1 &<- function() "f1"
f2 &<- function() "f2"
f3 &<- function() "f3"
fun_list &<- list(f1, f2, f3)
lapply(sample(3, 3), function(i) fun_list[[i]]())
f3 &<- function(new) ifelse(new, "f3-2", "f3")
lapply(sample(3, 3), function(i) fun_list[[i]]())
另一個解法是寫下每個 function call,隨機這組 function call 的順序,並按這順序 evaluate 它們。
call_list &<- c(quote(f1()), quote(f2()), quote(f3(new = TRUE)))
lapply(sample(call_list), eval)
推薦閱讀: