2015-10-22 40 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