嗨!我在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
语法都不太了解......
答案 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中修改了一个例子,看看你自己也可能很有用。