为了在Python和R之间非常快速地交换数据,我编写了一个相当脏的解决方案。在linux和OSX上。可能不是我现在必须让它在Windows中工作。
下面的代码运行一个python脚本,它构建一个原始向量,可以通过RApiSerialise序列化为R对象。
COMMAND = "python"
PATH_TO_SCRIPT='/GetCassandraData.py'
QueryCassandra <- function(query){
allArgs = c(PATH_TO_SCRIPT, query)
output.connection <- rawConnection(raw(length = 0), "r+")
exec_wait(COMMAND, args = allArgs, std_out = output.connection)
output <- rawConnectionValue(output.connection)
close(output.connection)
final <- unserializeFromRaw(output)
return(final)
}
这适用于OSX&amp;但是,Linux有一种趋势是在0x0a(换行)字节之前放置一个0x0d(回车)字节,这使得RApiSerialise无法对其进行反序列化。
我现在正尝试通过套接字进行通信来解决问题,但我似乎无法找到将make.socket()对象中的数据读取到原始向量的方法。
我试过了:
data <- read.socket(datasocket)
导致:
read.socket(datasocket)中的错误: 在字符串中嵌入nul:&#39; X \ n \ 0 \ 0 \ 0 \ 002 \ 0 \ 003 \ 004 \ 002 \ 0 \ 002 \ 003 \ 0&#39;
函数read.socket()尝试读取字符串并且不接受空字节。
有没有办法在R?
中读取套接字数据到原始向量答案 0 :(得分:0)
R服务器端:
library(sys)
COMMAND = "python"
PATH_TO_SCRIPT='/lengthCheck.py'
allArgs = c(PATH_TO_SCRIPT)
sys::exec_background(COMMAND, args = allArgs, std_out = TRUE, std_err = TRUE)
datasocket <- socketConnection(port = 1205, server = TRUE, open = "w+b", blocking = TRUE)
on.exit(close(datasocket))
datasize <- readBin(datasocket, what = "double")
data <- readBin(datasocket, what = "raw", n = datasize)
Python客户端:
import struct
import socket
import time
your_raw_array_to_send = bytearray([0x58, 0x0a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x04, 0x02, 0x00, 0x02, 0x03, 0x00])
arrayLength = len(your_raw_array_to_send)
datasize = struct.pack('d', arrayLength)
# Wait 100ms for R to set up a listening socket
time.sleep(.100)
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 1205))
client_socket.send(datasize)
client_socket.send(your_raw_array_to_send)
client_socket.close()