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。而且我不明白为什么。有人可以帮助我了解我在这里做错了什么吗?谢谢!
答案 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