2011-02-06 71 views
8

我正在尋找一種方法在某些情況下儘早終止應用功能。使用for循環,是這樣的:提前終止基於應用的功能(類似於中斷?)

FDP_HCFA = function(FaultMatrix, TestCosts, GenerateNeighbors, RandomSeed) {  
    set.seed(RandomSeed) 

    ## number of tests, mind the summary column 
    nT = ncol(FaultMatrix) - 1 
    StartingSequence = sample(1:nT) 
    BestAPFD = APFD_C(StartingSequence, FaultMatrix, TestCosts) 
    BestPrioritization = StartingSequence 
    MakingProgress = TRUE 
    NumberOfIterations = 0 
    while(MakingProgress) { 
    BestPrioritizationBefore = BestPrioritization 
    AllCurrentNeighbors = GenerateNeighbors(BestPrioritization) 

    for(CurrentNeighbor in AllCurrentNeighbors) { 
     CurrentAPFD = APFD_C(CurrentNeighbor, FaultMatrix, TestCosts) 

     if(CurrentAPFD > BestAPFD) { 
     BestAPFD = CurrentAPFD 
     BestPrioritization = CurrentNeighbor    
     break 
     } 
    } 

    if(length(union(list(BestPrioritizationBefore), 
        list(BestPrioritization))) == 1) 
     MakingProgress = FALSE 

    NumberOfIterations = NumberOfIterations + 1 
    } 
} 

我想重寫使用apply一些推導此功能。特別是,終止對具有增加的適應性的第一個人的評估,從而避免考慮其餘人羣的成本。

+2

您可能可以使用signalCondition/tryCatch /等的一些組合,但看起來很複雜。我會第二個JoshUlrich的問題。 – 2011-02-06 22:41:16

+2

-1用於發佈不可重現且具有語法錯誤的代碼。 – 2011-02-06 22:53:10

回答

1

除了讓你的示例代碼工作*我認爲這是一個明確的情況,一個循環是正確的選擇。雖然R可以將一個函數應用於整個變量向量[編輯:但你必須決定他們在應用之前],在這種情況下,我會使用一個while循環來避免運行不必要的重複的代價。警告:我知道for迴路在定時測試中與apply相比有優勢,但我還沒有看到while的類似測試。看看http://cran.r-project.org/doc/manuals/R-lang.html#Control-structures的一些選項。

while (*statement1*) *statement2* 

18

我覺得你真的不掌握apply家庭及其用途。與一般想法相反,它們是而不是等效於任何for -loop。可以這麼說,大多數for -loops相當於apply,但這是另一回事。

Apply完全按照它的說法:它依次對許多類似的參數應用函數,並返回結果。因此,根據定義,你不能脫離適用。您不再在全球環境中運行,因此原則上不能保留全局計數器,在每次執行後檢查一些條件並調整循環。您可以訪問全球環境,甚至使用assign<<-更改變量,但這非常危險。

理解上的差異,不讀apply(1:3,afunc)for(i in 1:3) afunc(i),但

afunc(1) 
afunc(2) 
afunc(3) 

在一個(塊)語句。這反映了你正在做的更好。 applybreak的等價物根本沒有意義,因爲它更像是一個代碼塊而不是循環。

0

我也在尋找一種方法,可以在 基於應用程序的循環中提前突破,並找到此線程。

即使有些人聲稱應用應該被視爲 「塊代碼」而不是「循環」,我仍然認爲這將是有用的,有可能打破它。原因是 基於應用的函數似乎執行得更快, 比for-loop快10-100倍。很多次 我在 超過幾分鐘之後在循環中運行了簡單的片段,而應用似乎在幾秒鐘內完成了相同的 工作。