# Example: Creating an R Script

> This example explains how to interface the **UiPath Process Mining** platform with external R scripts to implement external data processing.

## Introduction

This example explains how to interface the **UiPath Process Mining** platform with external R scripts to implement external data processing.

## Installing R

Follow these steps to be able to use R-script in the platform.

 <colgroup>
  <col/>
  <col/>
 </colgroup>
 
  
     Step  
     Action  
  
 
 
  
     1  
     Download the latest version of the R package from  https://cran.r-project.org/bin/windows/base/.  
  
  
     2  
     Install R on the server. Note: this must be the server on which UiPath Process Mining is installed. 
  
  
     3  
     Locate the installation directory and find path of Rscript.exe.  For example: C:/Apps/Rscript.exe  
  
 

R is installed on the server, and developers can connect to it with a connection string.

The installation path is needed to create connection strings for an R script.

:::important
Start with some dummy data, to test your workspace setup. For example, use the “Hello World” example as described in [Example: Creating a Python Script](https://docs.uipath.com/process-mining/standalone/2021.10/user-guide/example-creating-a-python-script#example%3A-creating-a-python-script). The dummy R script will than contain: `write("Hello world!", stderr()); quit("default", 1)`
:::

### High-level Overview

In this example an R script is created which clusters cases based on their traces.

### Steps

1. Setting up the Server Settings;
2. Writing the script.
3. Setting up the data source;
4. Setting up a script data source;

## Setting up the Server Settings

The generic script datasource requires handlers for all external processes that you want to run.

Follow these steps to add the script handler for R script.

| Step | Action |
| --- | --- |
| 1 | Go to the **Superadmin Settings** tab. |
| 2 | Add a field `GenericScriptHandlers` with as value an object with one key, “r”, which has as value the path to your python executable. For example:  `"GenericScriptHandlers": {"r": "C:/Apps/Rscript.exe",}` |
| 3 | Click on **SAVE**. |

## Writing the Script

In your text editor, start a blank text file and enter the following code.

```
# get command line arguments
args <- commandArgs(trailingOnly=TRUE)
inputfile <- args[1]
# read csv file
input <- file(inputfile, 'r')
df <- read.table(input, header=TRUE, sep=";")
# pre-processing
df <- table(df)
df <- as.data.frame.matrix(df)
df <- df[, sapply(data.frame(df), function(df) c(length(unique(df)))) > 1] #remove columns with unique value 
# cluster
df <- scale(df)
kc <- kmeans(df, centers = 5)
cluster <- kc$cluster
# output
resultdata <- cbind(rownames(df), cluster)
colnames(resultdata)[1] <- 'Case ID'
write.table(resultdata, row.names = FALSE, sep=";", qmethod = "double")
```

Follow the steps below.

| Step | Action |
| --- | --- |
| 1 | Save the text file as `script.r`. |
| 2 | Upload the `script.r` file to your workspace. |

## Setting up the Data Source

To define input data, create an attribute that generates a `.CSV` like string. It should be placed in the **Globals** table since it will serve as input in a table definition.

:::note
You can use the `csvtable` function to define input data.
:::

For this example, we have an application with the an **Events** table. See illustration below.

![docs image](https://dev-assets.cms.uipath.com/assets/images/process-mining/process-mining-docs-image-53770-15bcf9d0-9709af36.webp)

Follow these steps to create a lookup expression `R_input_data` from the **Globals** table to **Events**.

| Step | Action |
| --- | --- |
| 1 | Open the app in your development environment, and go to the **Data** tab. |
| 2 | Select the **Globals** table. Right-click on the **Globals** table in the table item list and select **New expression…**. |
| 3 | Set the type to **Lookup**. |
| 4 | Select **Events** as input table. |
| 5 | Enter the following expression:  `csvtable( 'CaseID', records.text(Case_ID) , 'Activity', records.text(Activity) )` |
| 6 | Enter **R_input_data** in the name field. |
| 7 | Click on **OK** to save the expression attribute in the **Globals** table. |

The expression attribute is created in the **Globals** table. See illustration below.

![docs image](https://dev-assets.cms.uipath.com/assets/images/process-mining/process-mining-docs-image-54784-ae6745d8-882f849b.webp)

## Setting up a Script Data Source

Next, set up a datasource table in the application which will call the script.

Follow these steps to set up the script data source.

| Step | Action |
| --- | --- |
| 1 | In the **Data** tab, create a new Connection string table. |
| 2 | Rename the `New_table` to `RscriptExample`. |
| 3 | Right click on the `RscriptExample` table and click **Advanced &gt; Options…**. |
| 4 | In the **Table Options** dialog, set the **Table scope** to **Workspace**. |
| 5 | Double click on the `RscriptExample` table to open the **Edit Connection String Table** window. |
| 6 | Enter the following as **Connection string**:  ``'driver={mvscript |
| 7 | Enter the following as **Query**:  `'' +'&scriptFile=' + urlencode("script.r") +'&inputData=' + urlencode(R_input_data)`  See illustration below. |
| 8 | Click on **OK**, and click on **YES** to reload the data. |

![docs image](https://dev-assets.cms.uipath.com/assets/images/process-mining/process-mining-docs-image-54304-b061f43e-2b2c65bd.webp)

When loading the data, new attributes are detected. Click on **YES**(2x) and click on **OK**.

![docs image](https://dev-assets.cms.uipath.com/assets/images/process-mining/process-mining-docs-image-53291-8a5293e2-19215d46.webp)

The `Rscript_example` table now has two datasource attributes, **Case_ID** and **cluster**.

See illustration below.

![docs image](https://dev-assets.cms.uipath.com/assets/images/process-mining/process-mining-docs-image-53968-2bba659c-b27f1a11.webp)

## Defining the R Script in the Query Field

Instead of using a separate file containing the R script, you can also define the R script in the **Query** field of the **Edit Connection String** dialog. In this case you use the `scriptText` parameter in stead of the `scriptFile` parameter.

See illustration below.

![docs image](https://dev-assets.cms.uipath.com/assets/images/process-mining/process-mining-docs-image-53764-948f6e84-90dfceb4.webp)
