RPython复制字符串,引号从R到Python

时间:2015-03-05 18:02:30

标签: python r string rpython

我无法使用RPython将字符串从R复制到Python中的字符串。我知道如果字符串没有引号就可以执行它的基本步骤但是如果字符串有引号则会出错。

例如:

test <- "byte"
python.assign("string",test)
python.exec("print(string)")

正常工作并打印:byte

然而,

test <- "'byte'"
python.assign("string",test)

给出错误:

File "<string>", line 2
    string =' [ "'byte'" ] '
                     ^
SyntaxError: invalid syntax

如果我试图逃避引号字符:

test <- "\'byte\'"
python.assign("string",test)

同样的错误:

File "<string>", line 2
    string =' [ "'byte'" ] '
                     ^
SyntaxError: invalid syntax

或者,如果我将内部单引号更改为双引号:

test <- "\"byte\""
python.assign("string",test)
Error in python.exec(python.command) : 
  Expecting , delimiter: line 1 column 6 (char 5)

任何想法我缺少什么,或者某个方向去哪看?

谢谢

2 个答案:

答案 0 :(得分:0)

我也在寻找这个问题的好答案。 我只建议解决方法:

您的示例:

library('rPython')
python.exec("string=chr(39).join(['byte'])")
python.get("string")
[1] "byte"
# Alternatively: python.exec("string=chr(39) + \"byte\" + chr(39)")
# to get: [1] "'byte'"    

更复杂的事情:假设我想要&#39; &#34;东西&#34;喜欢&#39;这个&#39;

library('rPython')
python.exec("string=\"Suppose \" + chr(39) + \"I want\" + chr(39) + \" \" + chr(34) + \"something\" + chr(34) + \" like \" + chr(39) + \"this\" + chr(39)")
python.get("string")
[1] "Suppose 'I want' \"something\" like 'this'"

另一个例子:

library('rPython')
python.exec("myCommand=\"gdal_translate -of GTiff -ot Int16 -a_nodata \" + chr(39) +\"-32768\" + chr(39) + \" NETCDF:\" + chr(39) + \"inputFile\" + chr(39) + \":Soil_Moisture \" + chr(39) + \"outputFile\" + chr(39)")
python.get("myCommand")
[1] "gdal_translate -of GTiff -ot Int16 -a_nodata '-32768' NETCDF:'inputFile':Soil_Moisture 'outputFile'"

答案 1 :(得分:0)

借助@matandked,您可以使用chr(39)替换gsub的单引号:

library(rPython)

test <- "'byte'"

python.assign("string", gsub("\\'", "' + chr(39) + '", test))
python.get("string")

# [1] "'byte'"

可能会产生意想不到的后果,但python.assign可能会以类似的方式进行修改:

python.assign <- function (var.name, value, ...) 
{
  value <- gsub("\\'", "' + chr(39) + '", value) ## Added this line...
  value <- toJSON(value, collapse = "", ...)
  python.command <- c(paste(var.name, "='", value, "'", sep = " "), 
                      paste(var.name, "= json.loads(", var.name, ")", sep = ""), 
                      paste("if len(", var.name, ") == 1:", sep = ""), paste("    ", 
                                                                             var.name, "=", var.name, "[0]"))
  python.command <- paste(python.command, collapse = "\n")
  python.exec(python.command)
  invisible(NULL)
}


## Now there's no need to substitute single quotes:
python.assign("string", test)
python.get("string")

# [1] "'byte'"