将函数从R转换为rpy2

时间:2018-02-22 08:33:53

标签: python rpy2

嗨!我在R中使用一个名为stylo的程序包用于样式目的(基本上是机器学习,用于识别基于词汇频率的文学作者),但我使用rpy2在Python中使用它。

在R中,我会这样做:

library(stylo)
cosine.delta = function(x){
        # z-scoring the input matrix of frequencies
        x = scale(x)
        # computing cosine dissimilarity
        y = as.dist( x %*% t(x) / (sqrt(rowSums(x^2) %*% t(rowSums(x^2)))) )
        # then, turning it into cosine similarity
        z = 1 - y
        # getting the results
        return(z)
    }
stylo(distance.measure="cosine.delta")

现在在Python中,我知道如何调用library和函数stylo,但我不知道如何定义函数cosine.delta。任何的想法?我尝试过这样的事情:

import rpy2.robjects as ro
R = ro.r
R.library("stylo")
cosinedelta = R.function(x){
        # z-scoring the input matrix of frequencies
        x = scale(x)
        # computing cosine dissimilarity
        y = as.dist( x %*% t(x) / (sqrt(rowSums(x^2) %*% t(rowSums(x^2)))) )
        # then, turning it into cosine similarity
        z = 1 - y
        # getting the results
        return(z)
}
R.stylo(distance.measure="cosinedelta")

它表示{语法无效。我一直在尝试不同的东西(其他类型的括号,使用

from rpy2.robjects.packages import importr 
base = importr('base')) 

但没有任何作用我对R或rpy2语法都不太了解......

1 个答案:

答案 0 :(得分:1)

您可以通过rpy2运行任何R代码,只需将其放在一个大字符串中,然后将该字符串作为参数传递给R()。对您而言,以下内容应该有效:

import rpy2.robjects as ro
R = ro.r
R.library("stylo")
R('''
    cosinedelta <- function(x){
        # z-scoring the input matrix of frequencies
        x = scale(x)
        # computing cosine dissimilarity
        y = as.dist( x %*% t(x) / (sqrt(rowSums(x^2) %*% t(rowSums(x^2)))) )
        # then, turning it into cosine similarity
        z = 1 - y
        # getting the results
        return(z)
    }
    ''')
R('stylo(distance.measure=\"cosinedelta\")')

这基本上只是R代码(cosinedelta而不是cosine.delta,不确定是否重要),包含在''' '''中以使其成为python中的多行字符串,并R( )包围它以将其作为R代码执行。

最后一行代码以类似的方式工作。为了安全起见,我在应该直接传递给R的引号标记前面添加了反斜杠,以确保python不会尝试对它们做任何有趣的事情,只是将它们传递到R中。

对于这个答案,我基本上在documentation中修改了一个例子,看看你自己也可能很有用。