gpt4 book ai didi

mysql - Delphi:如何在 Delphi 中调用 R 函数(或集成 R)?

转载 作者:可可西里 更新时间:2023-11-01 08:31:34 25 4
gpt4 key购买 nike

有没有人有关于如何在 Delphi 中使用 R 函数的提示或示例?我通过 MySQL 以集成方式使用 R 和 Delphi 我将输入从 Delphi 发送到 MySQL,在连接到 MySQL 的 R 脚本(包 RMySQL)上运行函数/并将输出返回到 MySQL,然后使用 Delphi 。但是这个过程很慢,完全取决于脚本 R 的大小。有没有人有加速这个过程的例子或提示?

website有一个例子,但所有链接都已关闭。下面的代码显示了如何使用现有的 R 和 Delphi 的一个小示例。

unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Datasnap.Provider,
Data.DB, Datasnap.DBClient;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

uses Unit2;

function StartRAndWait (CommandLine : string) : Boolean;
var
Proc_info: TProcessInformation;
Startinfo: TStartupInfo;
ExitCode: longword;
CreateOK : Boolean;
begin
Result := False;

{ Initialize the structures }

FillChar(proc_info, sizeof (TProcessInformation), #0);
FillChar(startinfo, sizeof (TStartupInfo), #0);
Startinfo.cb := sizeof (TStartupInfo);
Startinfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
Startinfo.wShowWindow := SW_HIDE;

{ Attempt to create the process. If successful wait for it to end}

CreateOK := CreateProcess(Nil, PChar('C:\Program Files\R\R-3.0.2\bin\x64\R.exe ' + CommandLine), nil,
nil,False, CREATE_NEW_PROCESS_GROUP+NORMAL_PRIORITY_CLASS, nil,
nil, StartInfo, proc_info);
if (CreateOK) then begin
WaitForSingleObject (proc_info.hProcess, INFINITE);
GetExitCodeProcess(proc_info.hProcess, ExitCode);
Result := True
end;
CloseHandle(proc_info.hThread);
CloseHandle(proc_info.hProcess);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Command: STRING;
begin

DataModule.ClientDataSet.Open;
DataModule.ClientDataSet.Insert;
DataModule.ClientDataSeta.AsFloat:= strtofloat(Edit1.Text);
DataModule.ClientDataSetb.AsFloat:= strtofloat(Edit2.Text);
DataModule.ClientDataSet.Post;
DataModule.ClientDataSet.ApplyUpdates(0);
DataModule.ClientDataSet.Close;
Screen.Cursor := crHourGlass;
try
Command := 'CMD BATCH script.R outputconsole.txt';
StartRAndWait(Command);
finally
Screen.Cursor := crDefault
end;

DataModule.ClientDataSet.Open;
DataModule.ClientDataSet.Last;
Edit3.Text:= DataModule.ClientDataSetresult.AsString;
DataModule.ClientDataSet.Close;

end;
end.

最佳答案

在我看来,这根本不是 Delphi 的问题。您已经提供了 Delphi 代码,但这里真正重要的是 R 代码。您的 Delphi 程序只是启动一个新的 R 进程,并等待它终止。是的,启动新进程会带来一些开销,但我猜大部分时间都花在了执行 R 代码上。

所以,如果你想加速整个计算,首先要做的就是加速计算时间最长的那部分。这似乎是在 R 下执行的部分。

可以将 R 嵌入到其他进程中。这可以让您避免在每次要执行 R 代码时都等待新的 R 进程启动。然而,嵌入 R 并不是最简单的事情。有一些很好的 R 包可以很容易地将 R 嵌入到 C++ 中。我在想 Dirk Eddelbuettel's Rcpp suite ,特别是 Rinside。你可以使用它,或者至少从中汲取灵感。但是,我强烈怀疑嵌入不会解决根本问题,这只是您的 R 代码运行时间比您希望的要长。

关于mysql - Delphi:如何在 Delphi 中调用 R 函数(或集成 R)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24954020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com