我想在 R 中对用 Python 编写的函数进行优化。我已经知道 scipy 具有优化功能,但我想要一些在 R 中但不在 scipy 中的函数。问题是我在 Python 脚本中有我的函数,这个函数需要除了参数之外的一些其他信息来适应。所以在初始化时,python 脚本会导入一些文件并执行一些操作,这就是为什么我不想每次都调用脚本,因为这会降低性能。
为此,我尝试调用一次 python 脚本,然后使用套接字连接到它。这是我的 R 脚本(它还不包括优化):
#Variables to initialize:
p_pos = '"[[0.,0.,True],[1.2378958026, 0,True],[0, 0.7152889725,True]]"'
names = '"[\'bridge\',\'hollow\',\'top\']"'
potential = "a-a"
symmetry = "non"
#Initialize python script
command = "python"
path2script='"Least_squares_potentials.py"'
#data pased to python
string = paste(p_pos, names, potential, symmetry, sep="---")
pattern = "---"
args = c(string, pattern)
# Add path to script as first arg
allArgs = c(path2script, args)
#Initialize
output = system2(command, args=allArgs, stdout=FALSE, wait=FALSE)
Sys.sleep(5)
client <- function(param){
while(TRUE){
con <- socketConnection(host="localhost", port = 6011, blocking=TRUE,
server=FALSE, open="r+")
response <- param
writeLines(response, con)
data <- readLines(con, 1)
print(data)
close(con)
}
}
#guess = "[3.589,3.995,1.418,1.809]"
guess = "[3.733,2.413,8]"
client(guess)
client("q")
在我的蟒蛇方面:
# Get the arguments passed in
string = sys.argv[1]
pattern = sys.argv[2]
# Perform the splitting
ans = string.split(pattern)
p_pos = ast.literal_eval(ans[0])
names = ast.literal_eval(ans[1])
potential = ans[2]
symm = ans[3]
#Initialize the potential (this is my function, which is actually a class)
Least = Least_squares(names, p_pos, potential, symm)
#----------------------------------------------------------#
#INITIALIZE SOCKET
#----------------------------------------------------------#
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 6011))
s.listen(1)
while 1:
(conn, addr) = s.accept()
data = conn.recv(1024)
if ( data == 'q' or data == 'Q'):
conn.close()
break;
else:
conn.send(Least.xi_square(np.array(ast.literal_eval(data))))
这样做我什么也没得到......好吧,我得到了“\xadȊ\xf3=\xd0Y@”,我不知道这是什么,等待几分钟后。那么任何人都可以帮我解决这个问题吗?也许还有另一种我不知道的方法。任何帮助将不胜感激。