Schedule R scripts without using Task Scheduler - r

I have RStudio installed on my Windows 7 machine however I am unable to access Windows Task Scheduler to automate some R scripts. Are there any alternatives in this situation? I have explored taskscheduleR however found out that this is just a wrapper of Task Scheduler. Open to ideas using VB scripts - basically any hack will do.

I would suggest VBA for your task and you need to learn how to use Application.OnTime;
You need other subs that triggers and stops this one as you desire; first one can start the schedule.
Public stop_running As Boolean
Public sTime As String
Sub Start(input As String)
stop_running = True 'This controls schedule in Application.Ontime
sTime = input
Application.OnTime TimeValue(sTime), "Rscript", Schedule:=stop_running
End Sub
Whenever you want to stop running this macro, the you run this one;
Sub Finish()
stop_running = False 'Set the schedule to false to stop the macro
Application.OnTime TimeValue(sTime), "Rscript", Schedule:=stop_running
End Sub
Then this is the sub that runs your r-script:
Sub Rscript()
'runs R script through cmd
If Not stop_running Exit Sub
Dim shell As Object
Set shell = VBA.CreateObject("WScript.Shell")
Dim waitTillComplete As Boolean: waitTillComplete = True
Dim style As Integer: style = 1
Dim errorCode As Integer
Dim path As String
path = "RScript C:\R\myscript.R"
errorCode = shell.Run(path, style, waitTillComplete)
End Sub
You can call the macro Start from immediate window like this:
Call Start(TimeValue("14:00:00 pm"))
And your macro will run at 2 p.m. Everyday.

Related

Running R script in VBA Wrong Directory

I have a macro that edits an R script.
That R script is then supposed to be called by the following VBA:
Dim shell As Object
Set shell = VBA.CreateObject("WScript.Shell")
Dim waitTillComplete As Boolean: waitTillComplete = True
Dim style As Integer: style = 1
Dim errorCode As Integer
Dim path As String
path = """" & "C:\Program Files\R\R-3.3.2\bin\i386\R.exe" & """ """ & "R RAM Cluster Script.R" & """"
errorCode = shell.Run(path, style, waitTillComplete)
The above code was from this question.
When I execute the macro, however, the R Command Line gives me an error stating:
'\\dm\home\myaccount\*Path of my original Excel File*'
"CMD.EXE was started with the above path as the current directory.
UNC Paths are not supported. Defaulting to Windows directory.
Argument 'R RAM Cluster Script.R' Ignored"
The script is stored in the folder that my Excel workbook is in.
Can anyone help me out with finding my problem?
Try this:
Sub test()
Dim shell As Object
Set shell = VBA.CreateObject("WScript.Shell")
Dim waitTillComplete As Boolean: waitTillComplete = True
Dim style As Integer: style = 1
Dim errorCode As Integer
Dim path As String
path = """C:\Program Files\R\R-3.3.1\bin\RScript.exe""" & """c:/temp/R RAM Cluster Script.R"""
errorCode = shell.Run(path, style, waitTillComplete)
End Sub
I would suggest trying to use powershell as a wrapper for your script because it DOES support UNC paths. So, something like this should work:
path = "Powershell.exe -executionpolicy bypass -Command &{'C:\Program Files\R\R-3.3.2\bin\i386\R.exe " & ThisWorkbook.Path & "\R RAM Cluster Script.R'}"

Run R script through access vba

I'm trying to run an R Script from my access DB so it will process some data before it is imported, however i'm having trouble as it fails at the errrorCode on the last line.The scrip is:
Private Sub cmdRcode_Click()
Dim shell As Object
Set shell = VBA.CreateObject("WScript.Shell")
Dim waitTillComplete As Boolean: waitTillComplete = True
Dim style As Integer: style = 2
Dim errorCode As Integer
Dim path As String
path = "C:\Users\Liam\Dropbox (BGD_058)\BGD_058\19_BFI_data\Analysis\r_scripts\BFI_DAT_1.R"
errorCode = shell.Run(path, style, waitTillComplete)
End Sub
EDIT:
Upon advice from the comments i've changed my file path, avoid spaces and substituted the errorCode as follows:
path = "Rscript C:\Users\Documents\BFI_Field_Forms\R\BFI_DAT_1.R"
errorCode = shell.Run("C:\Users\R\BFI_DAT‌​_1.R", 1, True)
I then updated the environment path to Advanced System Settings/Environment Variable and created a new variable called "PATH" with the line: C:\Program Files\R\R-3.2.2\bin\x64;
The result is that it opens my R file, however it does not run the R script. The priority is for it to run the script (so the data is processed), and if possible, the R file would not be visible to the user.
Any advice appreciated.

VBA could find R library

I am trying to use EXCEL as the front end for a R script. So far, I tested my R script in Windows CMD but I could not make it work in VBA. The error message is Error in library(readxl) : there is no package called 'readxl'. So it looks like VBA environment is picky.
Any suggestions on fixing this error? (fixed now)
Is there a way to run R script and save the function returned value (now it is 5) into a variable in VBA? I can do this by saving a text file and load again, but not sure if there is a better way to handle this.
a simple example of R script, which defines a function and calls it later.
est_var_dw <- function(){
library(readxl)
library(minpack.lm)
library(msm)
return(2+3)
}
est_var_dw()
a simple example of VBA
Sub run_r()
Dim shell As Object
Set shell = VBA.CreateObject("WScript.Shell")
Dim waitTillComplete As Boolean: waitTillComplete = True
Dim style As Integer: style = 1
Dim errorCode As Integer
Dim path As String
path = """" & Cells.Range("B1") & """ """ & Cells.Range("B2") & """ & Pause"
errorCode = shell.Run(path, style, waitTillComplete)
End Sub
Update
I figured out the first issue was due locations of different R packages, which can be solved by using .libpath
.libPaths(c(R_library_pth1, R_library_pth2))
There is a very good function for the second part of your question here: Capture output value from a shell command in VBA?
bburns-km defines a vba function ShellRun:
Public Function ShellRun(sCmd As String) As String
'Run a shell command, returning the output as a string'
Dim oShell As Object
Set oShell = CreateObject("WScript.Shell")
'run command'
Dim oExec As Object
Dim oOutput As Object
Set oExec = oShell.Exec(sCmd)
Set oOutput = oExec.StdOut
'handle the results as they are written to and read from the StdOut object'
Dim s As String
Dim sLine As String
While Not oOutput.AtEndOfStream
sLine = oOutput.ReadLine
If sLine <> "" Then s = s & sLine & vbCrLf
Wend
ShellRun = s
End Function
As long as RScript.exe is in your PATH, you can then call from VBA:
Sub Test()
Dim ScriptPath As String
Dim StringOut As String
ScriptPath = "C:\...\test.R" 'Your Path Here
'Assign
StringOut = ShellRun("RScript " & ScriptPath)
'Print
Debug.Print StringOut
End Sub
Anything that your R script prints to console during session will be returned to VBA as a string

How to run Command Prompt commands from VB.NET?

I have an application which build in vb.net.I never learn VB.I have worked on C#.net.when I run it's setup and execute it,I able to see command prompt.But when I using this application for scheduling task/creating task and scheduling, unable to see command prompt.
I am using following code that create process.
Dim Cw As New ProcessStartInfo(name, name & " " & name)
Cw.WindowStyle = ProcessWindowStyle.Maximized
Process.Start(Cw)
Is there is any other way to do this?Without making a process can I execute shell program?I am working on windows8 opeating system
You can use a simply Shell command, so:
Shell(path_to_your_exe, AppWinStyle.MaximizedFocus, true, 1000)
Be careful with path, if you have blanks escape they so
Shell(""d:\folder blank\my.exe"")
MSDN: https://msdn.microsoft.com/es-es/library/microsoft.visualbasic.interaction.shell(v=vs.110).aspx
If I understood the question, you might be using a Windows Form Application and you want to see the command line info of your external application.
In that case, you can use this code:
Sub Main()
Dim ProcessStartInfo = BuildProcessStartInfo("E:\path\to\your\exeFile.exe", "")
Dim proc = Process.Start(ProcessStartInfo)
End Sub
Public Function BuildProcessStartInfo(exeFilePath As String, arguments As String) As ProcessStartInfo
Dim startInfo = New ProcessStartInfo
startInfo.FileName = exeFilePath
startInfo.Arguments = arguments
startInfo.CreateNoWindow = False
startInfo.UseShellExecute = True
startInfo.WindowStyle = ProcessWindowStyle.Maximized
Return startInfo
End Function

Windows Script Host fails

I am trying to run a R script from Excel using VBA. Ideally, I would use an .R (Rscript) name to invoke R and run the process, or if that won't go, then invoke Rscript.exe and execute the filename passed to it.
REXcel is no good because it requires a 32-bit version of Excel (and I am not working in 1989)
I have found what seems to be a perfect script at (http://shashiasrblog.blogspot.co.uk/2013/10/vba-front-end-for-r.html) which, after suitable localisation looks like this:
Sub RunRscript()
Dim shell As Object
Set shell = VBA.CreateObject("WScript.Shell")
Dim waitTillComplete As Boolean: waitTillComplete = True
Dim style As Integer: style = 1
Dim errorCode As Integer
Dim path As String
path = "C:\Users\Charles\SkyDrive\Documents\Development\G4H\Technical evaluation templates\Graphical analysis.R"
errorCode = shell.Run(path, style, waitTillComplete)
End Sub
This fails with the message
Run Time Error '-2147024894 (80070002)':
Method 'Run' of object 'IWshShell3' failed.
Which tell me exactly nothing. I have tried Googling the error message but got nothing.
I have set the PATH variable to include the directory where R and Rscript live.
I suspect it is something straightforward, but there sems to be a lack of simple ways of executing R from Excel.
You need to add Rscript to your path, otherwise the shell doesn't know what program to send the file to. So modify the path to be
path = "rscript C:\Users\Charles\SkyDrive\Documents\Development\G4H\Technical evaluation templates\Graphical analysis.R"
You may have to provide the fill path to rscript depending on whether or not that directory is in your search path.
I am not sure if this is correct protocol (no doubt I shall receive some horrendous penalty), but thanks to Mr Flick and some poking about I have a solution:
Make sure that rscript.exe is in the system path.
Try to work out how many inverted commas are required to actually get Windows to understand that it is a directory.
Then:
Dim shell As Object
Set shell = VBA.CreateObject("WScript.Shell")
Dim waitTillComplete As Boolean: waitTillComplete = True
Dim style As Integer: style = 1
Dim errorCode As Integer
Dim path As String
path = "rscript ""C:\Users\Charles\SkyDrive\Documents\Development\G4H\Technical evaluation templates\Graphical analysis.R"""
errorCode = shell.Run(path, style, waitTillComplete)
The horrible parsing of cmd when handling white space in directory names finally succumbed to a brute force attack!
I had the same problem. Change the code to include path for both Rscript.exe and R file. The following code worked for me:
Sub RunRscript()
'runs an external R code through Shell
'The location of the RScript is 'C:\R_code'
'The script name is 'hello.R'
Dim shell As Object
Set shell = VBA.CreateObject("WScript.Shell")
Dim waitTillComplete As Boolean: waitTillComplete = True
Dim style As Integer: style = 1
Dim errorCode As Integer
Dim path, p1, p2 As String
path = "RScript E:\R_Folder\VBA_R.R"
p1 = "E:\R-3.1.2\bin\x64"
p2 = "E:\R_Folder"
errorCode = shell.Run("""" & p1 & "\Rscript.exe"" /filename """ & p2 & "\VBA_R.R"" /delay 10000 /preview /quiet", style, waitTillComplete)
'errorCode = shell.Run(path, style, waitTillComplete)
End Sub

Resources