Не удается получить доступ к kmeans со значением inss с помощью Rpy2

#python #r #rpy2

#python #r #rpy2

Вопрос:

Я пытаюсь обновить старый код Python с Rpy1 на Rpy2, но есть пара строк, которые я не могу запустить без ошибок:

 result = rpy.r.kmeans(datnorm, cls, kmeans_iterations, kmeans_nstart)
sse = sum(result['withinss'])
 

Я обновил зависимость Rpy до Rpy2 и переработал этот код, чтобы использовать Rpy2 importr для загрузки модуля и kmeans функции R stats. Вот как выглядит код после изменения:

 result = rstats.kmeans(matnorm, cls, kmeans_iterations, kmeans_nstart)
sse = sum(result['withinss'])
 

Когда выполняется этот код, я получаю эту ошибку:

 TypeError: Indices must be integers or slices, not <class 'str'>
 

Я понимаю, что это говорит о том, что я не могу использовать строку в качестве индекса, потому kmeans что возвращает целочисленный вектор. Как мне получить withinss значение, если результат не является dict?

Ответ №1:

.rx2() вероятно, это то, что вы хотите:

 result.rx2('withinss')
 

(см https://rpy2.github.io/doc/v3.4.x/html/vector.html#extracting-r-style )

Комментарии:

1. Идеально! В конце концов я понял, что могу result[4] получить доступ к общему значению withins, но это явно правильный способ.

2. ДА. Это также работает. Чтобы избежать неожиданностей, если библиотека R изменит порядок элементов, result вы также можете сделать что-то вроде result[result.names.index('withinss')]