使用循环在R中编写函数

时间:2015-10-22 02:35:58

标签: r loops matrix

我有以下矩阵:

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"))) 

专栏&amp;行名称是城市名称,矩阵的每个点都是两个城市之间的距离(以英里为单位)。例如,如果我的观点是[SanFrancisco,Berkeley],那么距离是13.9。

我试图找出一个给出城市向量的函数,以及城市之间的距离矩阵,该函数返回所提供城市之间的总距离。我知道如何在只涉及2个城市的地方开展一项活动。如果涉及多个城市,你将如何发挥作用? (Berkeley - &gt; SanFrancisco-&gt; PaloAlto等),我想你必须使用某种循环。我开始使用函数

get_distance <- function(cities, dists)

向量&#34;城市&#34;定义为

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]]) }
}

1 个答案:

答案 0 :(得分: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
 }