0

我有一个看起来像这样的距离函数

sed <- function(x, y){
x <- x / sum(x)
y <- y / sum(y)

x <- x[y > 0]
y <- y[y > 0]
y <- y[x > 0]
x <- x[x > 0]

xy <- x + y
a <- x / xy
b <- y / xy

w <- xy / 2
2 * prod(a^(a*w) * b^(b*w)) - 1

}

我有一些看起来像这样的数据:

> head(x)
             x         y
[1,] 0.5836377 0.8120142
[2,] 0.4642154 0.8857223
[3,] 0.8707579 0.4917120
[4,] 0.4688734 0.8832654
[5,] 0.8105051 0.5857316
[6,] 0.6409956 0.7675446

其中每一行是一个具有 x 和 y 坐标的点。所以 sed 计算行之间的距离。

我想使用距离函数绘制热图,但出现以下错误,我该如何解决?

> heatmap(as.matrix(x), distfun=as.dist(sed))
Error in as.vector(x, mode) : 
  cannot coerce type 'closure' to vector of type 'any'
4

1 回答 1

2

distfun参数需要一个函数,该函数将返回一个对象,该对象"dist"属于dist(). 您的函数计算两个向量之间的距离,而不是每对观察值的整个差异集。它不会返回正确类型的对象,并且如果没有迭代输入数据中所有行对所需的所有脚手架,它也不能返回。

尽管通过 CRAN 上可用的代理 包提供帮助,但不要害怕。这使您可以准确地提供您编写的函数类型,并提供生成相异矩阵所需的所有脚手架。

您需要先使用代理注册您的功能,然后才能在愤怒中使用它:

## create a new distance measure
mydist <- function(x,y) x * y

## create a new entry in the registry with two aliases
pr_DB$set_entry(FUN = mydist, names = c("mydist"))

只需替换mydist为您的函数名称,您可以在将其输入代理数据库时为其指定任何名称。继续此示例,然后您将dist()用于计算相异矩阵:

dist(X, method = "mydist")

看看这是否适合您的需求

install.packages("proxy")
require("proxy")

然后阅读?dist?pr_DB

于 2012-09-12T15:04:27.040 回答