2015-10-22 73 views
0

我有以下矩陣:兩個城市之間書寫功能與環路

dists <- structure(c(0, 13.9, 5.2, 42.6, 38.4, 19.7, 7.6, 13.9, 0, 12.3, 
       33, 19.1, 26.9, 17.8, 5.2, 12.3, 0, 34.7, 30.5, 17.9, 11.7, 42.6, 
       33, 34.7, 0, 15.7, 21.5, 46.9, 38.4, 19.1, 30.5, 15.7, 0, 17.2, 
       42.6, 19.7, 26.9, 17.9, 21.5, 17.2, 0, 26.2, 7.6, 17.8, 11.7, 
       46.9, 42.6, 26.2, 0), .Dim = c(7L, 7L), 
       .Dimnames = list(c("Berkeley", "SanFrancisco", "Oakland", "PaloAlto", 
            "SanMateo", "Hayward", "Richmond"), 
            c("Berkeley", "SanFrancisco", "Oakland", "PaloAlto", 
            "SanMateo", "Hayward", "Richmond"))) 

列&行的名稱是城市的名稱,和所述矩陣的每個點(以英里)的距離。例如,如果我的觀點是[SanFrancisco,Berkeley],則距離爲13.9。

我想弄清楚一個給定城市向量和城市之間距離矩陣的函數,該函數返回所提供城市之間的總距離。我知道如何在只有2個城市參與的情況下發揮作用。如果涉及多個城市,你將如何發揮功能? (伯克利 - > SanFrancisco-> PaloAlto等),我想你必須使用某種循環。我開始了與功能

get_distance <- function(cities, dists) 

其中向量「城市」爲

cities <- c("Berkeley", "SanFrancisco", "Oakland", 
     "PaloAlto", "SanMateo", "Hayward", "Richmond") 

我在思考如何處理這個函數的定義。我的思維過程是創建一個函數,它將添加城市對的總和,例如,如果您輸入函數get_distance(c("Berkeley", "Oakland", "SanFrancisco"), dists),那麼它將(伯克利,奧克蘭)和(奧克蘭,SanFrancisco)的距離相加。然後,我會讓該函數使用重複循環並中斷,直到達到輸入的城市數量(函數中的參數總數?)。我不認爲這是寫這個函數的有效方法,有沒有更好的方法?這是我對代碼的嘗試,但我不知道如何計算函數中可變數量的參數。我嘗試使用narg(),我想到了點參數,但似乎無法弄清楚。

get_distance <- function(cities, dists) { 

    i <- 1 #the ith city with i=(1,2,...)  
    number_of_cities = length(cities) 
    sum_dist <- 0 
    repeat { 
    sum_dist <- sum_dist + dist[cities[i-1], cities[i]] 
    if (i == number_of_cities) break 
    i <- i + 1 

    return(dists[cities[i-1], cities[i]]) } 
} 

回答

3

如何:

get_distance <- function(cities, dists) { 
    i <- match(cities, colnames(dists)) 
    start <- i[-length(i)] 
    end <- i[-1] 
    sum(dists[cbind(start, end)]) 
    } 

    get_distance(cities, dists) 
    #[1] 120 

但是,如果你真的想要一個循環:

get_distance <- function(cities, dists) { 
    d <- 0 
    for (i in 2:(length(cities))) { 
     d <- d + dists[cities[i-1], cities[i]] 
    } 
    d 
} 
+0

是使用重複循環不可能?我想看看我能否使用這種方法 –

+0

@AndyQuach是否可以使用重複循環?是的,它。是否推薦?可能不會。在R中,最好避免可避免的循環。 –

+0

雖然for循環在這裏是一個更明顯的選擇,但這是可能的。但是這是R;爲什麼使用循環,如果沒有需要它?只是爲了讓你的代碼更慢,更冗長? – RobertH