如何隨機地決定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)


推薦閱讀:

TAG:編程 | 編程技巧 | R編程語言 | R |