【问题标题】:Reading RAW data from an R socket从 R 套接字读取 RAW 数据
【发布时间】:2018-01-08 14:39:05
【问题描述】:

为了在 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 和 linux 上按预期工作,但是,Windows 倾向于在 0x0a(换行)字节之前放置一个 0x0d(回车)字节,这使得 RApiSerialise 无法反序列化它。

我现在正试图通过套接字通信来解决这个问题,但我似乎无法找到将数据从 make.socket() 对象读取到原始向量的方法。

我试过了:

data <- read.socket(datasocket)

导致:

read.socket(datasocket) 中的错误: 在字符串中嵌入 nul:'X\n\0\0\0\002\0\003\004\002\0\002\003\0'

函数 read.socket() 尝试读取字符串并且不接受空字节。

有没有办法将套接字数据读取到 R 中的原始向量中?

【问题讨论】:

  • 我已经通过使用 readBin() 找到了解决方案,当我完成我的代码后,我会在这里发布。

标签: r sockets binary


【解决方案1】:

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()

【讨论】:

    猜你喜欢
    • 2014-06-07
    • 2020-02-22
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2011-10-10
    • 1970-01-01
    相关资源
    最近更新 更多