计算曼哈顿距离和欧式距离

时间:2018-10-03 08:09:28

标签: r euclidean-distance

my_dist_calculator <- function(a, b, metric = "euclidean"){
 if(metric == "manhattan"){
    mydistance<-function(a,b){
      d<-abs(a-b)
      d<-sum(d)
      return(d)
    }

}else{
    mydistance2<- function(a, b){
      d<-(a-b)^2
      d<-sum(d)
      d<-sqrt(d)
      return(d)
    }

  }

  return(mydistance) 
}
a = c(1.7, 5)
b = c(4, 72)

my_dist_calculator(a, b, metric = "manhattan")
my_dist_calculator(a, b)

嗨,我是R的新手,我目前正在尝试计算欧式距离和曼哈顿距离。我得到的输出是:环境:0x10c0bfb60和字节码:0x10caea288。而且我不明白为什么。有人可以帮助我了解我在这里做错了什么吗?谢谢!

3 个答案:

答案 0 :(得分:3)

在R中工作时,应该尝试为想要执行的任何操作找到函数。在99%的情况下,只有一个(可能不是在基本软件包中,而是在互联网上的某个地方。

您的问题的解决方案是// represent object as you need Console.WriteLine($"{mage.Name} - walks in {mage.Armour}, beats with {mage.Weapon}"); // output: John, Doe - walks in Robes, beats with Staff (使用dist检查文档)代码如下:

?dist

对于您的代码,您需要在return语句中评估函数:

a = c(1.7, 5)
b = c(4, 72)
x <- rbind(a,b)
dist(x, method = "euclidean")
dist(x, method = "manhattan")

答案 1 :(得分:1)

此处不需要功能内的功能。只需计算d,然后在if....else...结束后重新调整它即可。

my_dist_calculator <- function(a, b, metric = "euclidean"){
  if(metric == "manhattan"){
      d<-abs(a-b)
      d<-sum(d)
  }else{
      d<-(a-b)^2
      d<-sum(d)
      d<-sqrt(d)
  }
  return(d) 
}

可以工作

a = c(1.7, 5)
b = c(4, 72)
my_dist_calculator(a, b, metric = "manhattan")
# [1] 69.3
my_dist_calculator(a, b)
# [1] 67.03947

答案 2 :(得分:1)

您应该像其他人以前所说的那样使用dist

但是出于示例的考虑,我们也可以使用match.arg

my_dist_calculator <- function(a, b, metric = c("euclidean", "manhatten")) {
    metric <- match.arg(metric)
    switch(metric,
           euclidean = sqrt(sum((a - b) ^ 2)),
           manhatten = sum(abs(a - b)))
}

a = c(1.7, 5)
b = c(4, 72)

my_dist_calculator(a, b) # default, i.e. euclidean
# [1] 67.03947

my_dist_calculator(a, b, "manhatten")
# [1] 69.3