C ++ рдореЗрдВ R рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рд▓рд╛рдн рдХреИрд╕реЗ рд▓реЗрдВ

R рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдФрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдпрд╣ GNU рдкреНрд░реЛрдЬреЗрдХреНрдЯ - рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдПрдХ рдореБрдХреНрдд рдУрдкрди-рд╕реЛрд░реНрд╕ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдг рд╣реИред

рдЖрд░ рдиреЗ рд╕рднреА рдЕрд╡рд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдПрдХрддреНрд░ рдХрд┐рдП рд╣реИрдВ рдФрд░ рди рдХреЗрд╡рд▓ рджреЗрд╢реА рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдпрд╣ рдПрд╕рдкреАрдПрд╕рдПрд╕, рд╕реНрдЯреЗрдЯрд┐рд╕реНрдЯрд┐рдХрд╛, рдПрд╕рдПрдПрд╕, рд╡реЛрд▓реНрдлреНрд░рд╛рдо рдореИрдердореЗрдЯрд┐рдХрд╛ рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдЬреИрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рдЧрдгрд┐рддреАрдп рдкреИрдХреЗрдЬреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИред рдЖрдк рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ R рдХреЛ рдХреИрд╕реЗ рдПрдХреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
C ++ рдореЗрдВ R рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА habrahabr рдкрд░ рдПрдХ рд▓реЗрдЦ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдиреЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХреЗ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдХрд┐ рдпрджрд┐ рдЖрдкрдХрд╛ рдХреЛрдб GPL- рд╕рдВрдЧрдд рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдиреНрдпрдерд╛ рд╡рд╣рд╛рдБ рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реИ - Rerve рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

Rserve


Rerve рдПрдХ рдЯреАрд╕реАрдкреА / рдЖрдИрдкреА / рдпреВрдирд┐рдХреНрд╕ рд╕реЙрдХреЗрдЯ рд╕рд░реНрд╡рд░ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рд▓рд┐рдВрдХ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрд░ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рд▓реЛрдХрдкреНрд░рд┐рдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ C / C ++, Java, PHPред LGPL рдХреЗ рддрд╣рдд рд╡рд┐рддрд░рд┐рдд рдЧреНрд░рд╛рд╣рдХ рдХреЛрдбред

R рдФрд░ Rerve рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
# sudo apt-get instal r-base # sudo R > install.packages("Rserve"); 

рдЕрдм рдпрд╣ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ:
 # R CMD Rserve 

рдбрд┐рдмрдЧ рдореЛрдб рднреА рд╣реИ
 # R CMD Rserve.dbg 

рдЬрдм рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ Rerve рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреЛрд░реНрдЯ (6311) рдкрд░ рдЯреАрд╕реАрдкреА / рдЖрдИрдкреА рд╕рд░реНрд╡рд░ рдореЛрдб рдореЗрдВ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпреВрдирд┐рдХреНрд╕ рд╕реЙрдХреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП --RS-socket рдлреНрд▓реИрдЧ рдХреЗ рд╕рд╛рде Rerve рдЪрд▓рд╛рдПрдВ
 # R CMD Rserve --RS-socket "/home/zoberg/mysocket" 

рдЙрдкрд▓рдмреНрдз рдЭрдВрдбреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдХреЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
 # R CMD Rserve --help 

C ++ рдХреНрд▓рд╛рдЗрдВрдЯ


C ++ рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ 4 рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ: Rconnection.h (рдпрд╣рд╛рдВ рдЙрди рд╕рднреА рд╡рд┐рдЬреНрдЮрд╛рдкрдиреЛрдВ рдХреЛ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ), Rsrv.h , config.h (рдХреЗрд╡рд▓ Windows рдкрд░ рдЖрд╡рд╢реНрдпрдХ), sisocks.h (рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╕реЙрдХреЗрдЯ рдФрд░ рдПрдХ Rconnection.cc ) ред рдЖрдк рдЙрди рд╕рднреА рдХреЛ рдЧреБрдердм рдкрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рднрдВрдбрд╛рд░ рд╕реЗ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред

рддреЛ, рдЪрд▓рд┐рдП рдЙрд╕ рдбреЗрдореЛ рдкрд░ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдЬреЛ рдЬреНрдпрд╛рджрд╛рддрд░ рдореБрдЦреНрдп рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ

 /// main.cpp #include <iostream> using std::cout; #define MAIN // c  sisocks.h #define SOCK_ERRORS // verbose socket errors #include "sisocks.h" #include "Rconnection.h" //     C++ API int main(int argc, char **argv) { initsocks(); //    Win32 -     unix //     Rserve. //     - "127.0.0.1", 6311. //    unix sockets,     : // Rconnection *rc = new Rconnection("/home/zoberg/mysocket", -1); Rconnection *rc = new Rconnection(); int i=rc->connect(); if (i) { char msg[128]; sockerrorchecks(msg, 128, -1); printf("unable to connect (result=%d, socket:%s).\n", i, msg); return i; } double d[6] = { 1.5, 2.4, 5.6, -1.2, 0.6, 1.7 }; //      "a"  R Rdouble *rd = new Rdouble(d, 6); rc->assign("a", rd); delete rd; //   "b"  2 x 3     b * t(b) Rdouble *x = (Rdouble*) rc->eval("b<-matrix(a,2); b%*%t(b)"); if (x) { //    ,    cout << x << "\n"; //       Rinteger *dim = (Rinteger*) x->attribute("dim"); if (dim) cout << dim->intAt(0) << " by " << dim->intAt(1) << " matrix\n"; //    ( ) double *d = x->doubleArray(); int i=0, ct = x->length(); while (i < ct) { cout << d[i++] << " "; } cout << "\n"; //   delete x; } //      i  R int ia[6] = { 1, 4, 6, 3, 5 , 2 }; Rinteger *ri = new Rinteger(ia, 6); rc->assign("i", ri); delete ri; //   тАФ      , //       1936   //      . //      R,   Rvector *iris = (Rvector*) rc->eval("data(iris); iris"); if (!iris) { cout << "oops! couldn't get iris data\n"; delete rc; return 0; } //         (sepal width) - //      Rserve,         Rdouble *sw = (Rdouble*) iris->byName("Sepal.Width"); double *swd = sw->doubleArray(); // and print it ... { int i=0, ct=sw->length(); while (i<ct) { cout << swd[i++] << " "; } cout << "\n"; } //    ,   iris, //  sw  . delete iris; //   .   . delete rc; } 

рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдзреНрдпрд╛рди рджреЗрдВ: рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдореЗрдореЛрд░реА рдХреЛ Rmessage рдСрдмреНрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐ "eval" рдХрд╣рддреЗ рд╕рдордп рдирд┐рд╣рд┐рдд рд╣реИред рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдорд╛рд▓рд┐рдХ Rexp рд╣реИ, рдЬрд┐рд╕реЗ eval рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕реЗ рдореБрдЦреНрдп рдХреЙрд▓ рдХрд░реЗрдВ)ред рдЖрдк рдореБрдЦреНрдп рдПрдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХреЛрдИ рдЕрдиреНрдп рд░реЗрдХреНрд╕рдкреА рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдореБрдЦреНрдп Rexp рдХреЗ рдЬрд╛рд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЦреНрдп Rexp рд╕реЗ рдЬреБрдбрд╝рд╛ рдХреЛрдИ рднреА Rexp рдЕрдорд╛рдиреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЦреНрдп рд░реЗрдХреНрд╕рдкреА рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рднреА рд╕рдВрдХреЗрдд рдЕрдорд╛рдиреНрдп рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрдмрд▓рдЕрд░реЗ () рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛)ред

рд╕рдВрдХрд▓рди
 # g++ -c Rconnection.cc # g++ Rconnection.o main.cpp -o RExample -lcrypt 

рдФрд░ рднрд╛рдЧреЛ
 # ./RExample Rdouble[4] 2 by 2 matrix 33.97 -2.1 -2.1 10.09 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 3.7 3.4 3 3 4 4.4 3.9 3.5 3.8 3.8 3.4 3.7 3.6 3.3 3.4 3 3.4 3.5 3.4 3.2 3.1 3.4 4.1 4.2 3.1 3.2 3.5 3.6 3 3.4 3.5 2.3 3.2 3.5 3.8 3 3.8 3.2 3.7 3.3 3.2 3.2 3.1 2.3 2.8 2.8 3.3 2.4 2.9 2.7 2 3 2.2 2.9 2.9 3.1 3 2.7 2.2 2.5 3.2 2.8 2.5 2.8 2.9 3 2.8 3 2.9 2.6 2.4 2.4 2.7 2.7 3 3.4 3.1 2.3 3 2.5 2.6 3 2.6 2.3 2.7 3 2.9 2.9 2.5 2.8 3.3 2.7 3 2.9 3 3 2.5 2.9 2.5 3.6 3.2 2.7 3 2.5 2.8 3.2 3 3.8 2.6 2.2 3.2 2.8 2.8 2.7 3.3 3.2 2.8 3 2.8 3 2.8 3.8 2.8 2.8 2.6 3 3.4 3.1 3 3.1 3.1 3.1 2.7 3.2 3.3 3 2.5 3 3.4 3 

рд╣реЛ рдЧрдпрд╛! R рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, Rconnection.h рджреЗрдЦреЗрдВред

Rserv.conf


рдореИрдВ рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ Rserv.conf рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рдХрд╣реВрдВрдЧрд╛ред рдпрд╣ Rerve рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреБрдЫ R рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ /etc/Rserv.conf рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк Rerve рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп --RS-conf рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЕрд▓рдЧ рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Rserv.conf рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

workdir [/tmp/Rserv]

pwdfile [none=disabled]

remote enable|disable [disable]

auth required|disable [disable]
plaintext enable|disable [disable]
fileio enable|disable [enable]
interactive yes|no [yes] (since 0.6-2)

( 0.1-9):
socket [none=disabled]
port [6311]
maxinbuf [262144]

( 0.3):
maxsendbuf [0=unlimited]
uid [none]
gid [none]
su now|server|client [none] (since 0.6-1)


( 0.3-16):
source
eval

( 0.5 unix):
chroot [none]
sockmod [0=default]
umask [0]

( 0.5-3):
encoding native|utf8|latin1 [native]


Rserve C++ , . , - .

PS load-balancer Rserve: RSproxy .

UPDATE: Windows Ws2_32.lib.

Source: https://habr.com/ru/post/In198012/


All Articles