В пакете stats
, похоже, нет инструментов для этого.Спасибо @flodel за альтернативную реализацию в неосновном пакете.
Я копался в определении класса "dist"
в исходном ядре R, то есть в S3 старой школы без инструментов в dist.R
исходный файл, подобный тому, о котором я спрашиваю в этом вопросе.
Документация к функции dist()
с пользой указывает, что (и я цитирую):
Нижняятреугольник матрицы расстояний, сохраняемый столбцами в векторе, скажем do
.Если n
является числом наблюдений, т. Е. n <- attr(do, "Size")
, то для i i и j
составляет:
do[n*(i-1) - i*(i-1)/2 + j-i]
Длина вектора равна n*(n-1)/2
, то есть порядка n^2
.
(конечная кавычка)
Я воспользовался этим в следующем примере кода дляопределить себя "dist"
аксессор.Обратите внимание, что этот пример может возвращать только одно значение за раз.
################################################################################
# Define dist accessor
################################################################################
setOldClass("dist")
getDistIndex <- function(x, i, j){
n <- attr(x, "Size")
if( class(i) == "character"){ i <- which(i[1] == attr(x, "Labels")) }
if( class(j) == "character"){ j <- which(j[1] == attr(x, "Labels")) }
# switch indices (symmetric) if i is bigger than j
if( i > j ){
i0 <- i
i <- j
j <- i0
}
# for i < j <= n
return( n*(i-1) - i*(i-1)/2 + j-i )
}
# Define the accessor
"[.dist" <- function(x, i, j, ...){
x[[getDistIndex(x, i, j)]]
}
################################################################################
И это, кажется, работает нормально, как и ожидалось.Однако у меня возникают проблемы при работе функции замены.
################################################################################
# Define the replacement function
################################################################################
"[.dist<-" <- function(x, i, j, value){
x[[get.dist.index(x, i, j)]] <- value
return(x)
}
################################################################################
Тестовый запуск этого нового оператора присваивания
dist1["5", "3"] <- 7000
Возвращает:
"R> Ошибка в dist1["5", "3"] <- 7000
: неверное количество подписчиков в матрице "
В ответ на вопрос, я думаю, @flodel ответил на вопрос лучше, но все же подумал, что этот" ответ "также может быть полезен.
Я также нашел несколько хороших примеров S4 в квадратных скобках и определениях замены в пакете Matrix , которые можно легко адаптировать из этого текущего примера.