public UAReturn InstallPackageFromZip(string fullpathpackagefilename, bool autoLoad = true, bool overwrite=false)//autoload loads package in memory after install
{
UAReturn result = new UAReturn() { Success = false };
string pkgversion = string.Empty;
string packagename = GetPackageNameFromZip(fullpathpackagefilename, out pkgversion);// get package name.
if (packagename.Trim().Length < 1) // no packagename, may be because of error.
{
result.Error = "Error:No Packages Found!";
return result;
}
//See if package is already installed, then dont install it. OR Install if Overwrite is true
if (!isPackageInstalled(packagename) || overwrite)
{
//See if you really want to execute following.
if (overwrite)
{
if (_dispatcher.IsLoaded(packagename)) // if package is already loaded. Unload
{
UnLoadPackage(packagename);
}
if (isPackageInstalled(packagename)) // and uninstall it
{
UninstallPackage(packagename);
}
}
//string AppRPackageDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location).Replace('\\', '/') + "/RPackages";
string parentDir = Path.GetDirectoryName(fullpathpackagefilename).Replace('\\', '/');
string command = string.Empty;
string errmsg = null;
StringBuilder sb = new StringBuilder("");
//command = "library(tools)";//already excuted in constructor
//_dispatcher.EvaluateNoReturn(command);
//_journal.WriteLine(command);
command = string.Format("write_PACKAGES('{0}')", parentDir);
errmsg = _dispatcher.EvaluateNoReturn(command);
_journal.WriteLine(command);
if (errmsg != null && errmsg.Trim().Length > 1) //error occurred
{
sb.Append(errmsg);
}
command = string.Format("install.packages('{0}', repos=NULL, contriburl='file:///{1}')", packagename, parentDir);
errmsg = _dispatcher.EvaluateNoReturn(command);
_journal.WriteLine(command);
if (errmsg != null && errmsg.Trim().Length > 1) //error occurred
{
sb.Append(errmsg);
}
if (!(errmsg.ToLower().Contains("error") || errmsg.ToLower().Contains("warning")))
{
result.Success = true;
pkgnamelist.Add(packagename);//"BlueSky" or "MASS" or "car" not zip filenames
}
if (autoLoad)//(&& result.Success) // we can use this 'result.Success' to load package only if it installed without errors/warning.
{//But we dont know, there may not be error realted to package install but something else so its better to try loading package
sb.Append("Loading package: ");
UAReturn rr = LoadPackage(packagename, false); // Normally, when we install package, it should also be loaded. Can also be done outside.
sb.Append(rr.Error); //package loading error or warning.
}
result.Error = sb.ToString();
}
else
{
result.Error = packagename + " already installed.";
pkgnamelist.Add(packagename);//if you want to load already installed package, automatically
}
return result;
}