我试图用rpy2要逃避的multi.split功能questionr包。
这是我的代码
from rpy2 import robjects
from rpy2.robjects.packages import importr
questionr = importr(str('questionr'))
data = ["red/blue", "green", "red/green", "blue/red", "red/blue", "green", "red/green", "blue/red", "red/blue", "green", "red/green", "blue/red", "red/blue", "green", "red/green", "blue/red", "red/blue", "green"]
data_vector = robjects.StrVector(data)
multi_split = questionr.multi_split
data_table = multi_split(data_vector, split_char='/')
在最后一行之后,出现以下错误:
RRuntimeError: Error in `colnames<-`(`*tmp*`, value = c("c(\"red/blue\",_\"green\",_\"red/green\",_\"blue/red\",_\"red/blue\",_\"green\",_.blue", :
'names' attribute [4] must be the same length as the vector [3]
我认为这与我要发送的向量的大小有关,因为如果我删除了最后一个项目
data = ["red/blue", "green", "red/green", "blue/red", "red/blue", "green", "red/green", "blue/red", "red/blue", "green", "red/green", "blue/red", "red/blue", "green", "red/green", "blue/red", "red/blue"]
然后运行
data_vector = robjects.StrVector(data)
multi_split = questionr.multi_split
data_table = multi_split(data_vector, split_char='/')
我没有收到任何错误消息。同样,如果我更改了“ split_char”变量,例如:
data_table = multi_split(data_vector, split_char='.')
无论我发送的数组大小如何,我都不会收到错误消息。
我试图直接在R中运行匹配的代码(使用R-Studio),但运行没有问题。关于如何解决此问题的任何想法?
这似乎是因为该函数multi_split
(multi.split
在R包中)试图使用与第一个参数("data_vector"
此处)相关联的表达式的字符串表示形式。
R函数的签名是:
multi.split(var, split.char = "/", mnames = NULL)
他的文档mnames
是:
产生的变种的名称。如果为NULL,则根据原始变量名称和答案计算名称。
在调用中multi_split(data_vector, split_char='/')
,嵌入式R无法看到变量名,因为这是Python调用,并且data_vector
是匿名变量(仅内容,无变量名)。
我虽然可以指定mnames
,但是您检查了一下,但不起作用(请参阅下面的评论)。这就是代码似乎要说的:vname <- deparse(substitute(var))
无论是否指定了mnames,都会对行进行评估:https : //github.com/juba/questionr/blob/9cf09f3ffcd6c8df24182380f12d52b061c221ef/R/table.multi.R#L161
另一种方法是计算R表达式的用法。一个较旧的帖子应该为此提供必要的信息:哪个对象从rpy2传递给R?
第三种可能性是创造性地将Python字符串作为R代码进行混合:
data = ["red/blue", "green", "red/green", "blue/red", "red/blue", "green", "red/green", "blue/red", "red/blue", "green", "red/green", "blue/red", "red/blue", "green", "red/green", "blue/red", "red/blue", "green"]
data_vector = robjects.StrVector(data)
# binding the R vector to a symbol in R's "GlobalEnv"
robjects.globalenv['mydata'] = data_vector
# the call is now in a Python string that is evaluated as R code
data_table = robjects.r("multi.split(data_vector, split_char='/')")
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句