如何在Python代码中使用rpy2传递R函数作为参数



我正试图为出色的NMF包制作一个Python接口-https://cran.r-project.org/web/packages/NMF/NMF.pdf(因为它比Python选项灵活得多)。到目前为止还不错。

我想出了这样的东西:

# Python rpy2
__NMF = importr("NMF")
n_comp_R = robjects.IntVector(n_components)
nmf_ro = self.__NMF.nmf(data, n_comp_R, methods, self.seed, nrun=10)

它就像一个符咒。方法是我可以使用的可能算法的列表:

nmfAlgorithm()

[1] "brunet"KL"lee"Frobenius"offset">

[6] "nsNMF"ls nmf"pe nmf">

[11] "snmf/l">

其他可能性是使用自定义算法,如NMF文档中所述

# R code
my.algorithm <- function(x, seed, param.1, param.2) {
# do something with starting point ...
# return updated starting point
return(seed)
} 
res <- nmf(data, n_comp, my.algorithm)

如何使用rpy2复制此内容?

我试过这样的东西:

import rpy2.robjects as robjects
my_algorithm = robjects.r('''
function (x, seed, scale.factor = 1) 
{
pca <- prcomp(t(x), retx = TRUE)
factorization.rank <- nbasis(seed)
cat(seed)
basis(seed) <- abs(pca$rotation[, 1:factorization.rank])
coef(seed) <- t(abs(pca$x[, 1:factorization.rank]))/scale.factor
return(seed)
}
''')
nmf_ro = __NMF.nmf(data, n_comp_R, my_algorithm.r_repr(), nrun=1)

但它并没有产生魔力

NMF算法-密钥"key=函数(x,seed,scale.actor>=1)没有匹配条目

pca<-prcomp(t(x),retx=TRUE)

factorization.rank<-nbasis(种子)

猫(种子)

基础(种子)<-abs(pca$rotation[,1:因子分解.秩])

coeff(seed)<-t(abs(pca$x[,1:因子分解.rank]))/scale.factor

返回(种子)

}"。

使用以下其中之一:"brunet"、"Frobenius"、"KL"、"lee"、"ls nmf"、".M#brunet"、"nsNMF"、"offset"、"pe nmf",".R#brunet'、".R#lee"、".R#nsNMF",".R#offset","siNMF","snmf/l"、"snmf/R"。

warnings.warn(x,RRuntimeWarning)

我想知道这里是否有人能帮我?

最初的提问者在Github上回答了关于NMF项目的问题。如上所述,您将新算法定义为一个函数,然后使用setNMFMethod将该函数添加到执行非负矩阵分解的算法的注册表中,然后您可以按名称调用它。

最新更新