【问题标题】:Writing functions in R with loops在 R 中用循环编写函数
【发布时间】:2015-10-22 02:35:57
【问题描述】:

我有以下矩阵:

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 个城市的情况下制作功能。在涉及多个城市的情况下,您将如何创建功能? (伯克利->旧金山->帕洛阿尔托等),我认为你必须使用某种循环。我从函数开始

get_distance <- function(cities, dists)

向量“城市”定义为

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

我在考虑如何处理这个函数。我的想法是创建一个函数,它将添加城市对的总和,例如,如果您输入函数get_distance(c("Berkeley", "Oakland", "SanFrancisco"), dists),那么它将求和(伯克利,奥克兰)和(奥克兰,旧金山)的距离。然后我会让函数使用重复循环并中断,直到它达到输入的城市数(函数中的参数总数?)。我不认为这是编写此函数的有效方法,有更好的方法吗?这是我对代码的尝试,但我不知道如何计算函数中可变数量的参数。我尝试使用 narg() 并考虑了 dot 参数,但似乎无法弄清楚。

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

【问题讨论】:

    标签: r loops matrix


    【解决方案1】:

    这个怎么样:

     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
     }  
    

    【讨论】:

    • 不能使用重复循环吗?我想看看我是否可以使用这种方法
    • @AndyQuach 是否可以使用重复循环?是的,它。推荐吗?可能不是。在 R 中,最好在可以避免的情况下避免循环。
    • 这是可能的,尽管 for 循环在这里是一个更明显的选择。但这是R;如果不需要循环,为什么要使用循环?只是为了让你的代码更慢更冗长?
    • @RobertH 你能解释一下开始和结束吗?不太明白
    • start 是旅程每一段的起始城市的向量(所有访问过的城市,除了最后一个); end 是结束城市的向量(除了第一个)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2021-11-15
    • 2021-07-12
    • 1970-01-01
    • 2015-11-01
    • 2020-07-18
    • 1970-01-01
    相关资源
    最近更新 更多