---
author: "George G. Vega Yon"
---

# Getting R

To install R just follow the instructions available at http://cran.r-project.org

# Getting RStudio

RStudio is the most popular Integrated Development Environment (IDE) for R that is developed by the company of the same name. While having RStudio is not a requirement for using netdiffuseR, it is highly recommended.

To get RStudio just visit https://www.rstudio.com/products/rstudio/download/.

# Getting netdiffuseR

`netdiffuseR` has two different versions: the development version (available at https://github.com/USCCANA/netdiffuseR), and the stable version (available on https://cran.r-project.org/package=netdiffuseR). You can get either of the two but it is significantly easier to get the stable version (and we recommend to do so)

## CRAN version

For this version just go to your R console and type:

```r
install.packages("netdiffuseR")
```

## Github version

For the github version you will need to have installed the [`devtools`](https://cran.r-project.org/package=devtools) R package which allows to build netdiffuseR from source[^buildnetdiffuseR]. This can be done in the following steps:

[^buildnetdiffuseR]: Building an R package from source means that you will use `R CMD INSTALL` utility on the command line of your operating system. Depending on the R package, it may require having a C/C++ compiler such as gcc g++ or clang. This makes installing packages from source code a bit harder, that's why we recommend getting the CRAN version which is already compiled and ready for your operating system.

```r
install.packages("devtools") # If you don't have devtools already!
devtools::install_github("USCCANA/netdiffuseR")
```

# A ~~gentle~~ Quick n' Dirty Introduction to R

Some common tasks in R

0.  Getting help (and reading the manual) is *THE MOST IMPORTANT* thing you should know about. For example, if you want to read the manual (help file) of the `read.csv` function, you can type either of these:
    ```r
    ?read.csv
    ?"read.csv"
    help(read.csv)
    help("read.csv")
    ```
    If you are not fully aware of what is the name of the function, you can always use the *fuzzy search*
    ```r
    help.search("linear regression")
    ??"linear regression"
    ```
    
    

1.  In R you can create new objects by either using the assign operator (`<-`) or the equal sign `=`, for example, the following 2 are equivalent:
    ```r
    a <- 1
    a =  1
    ```
    Historically the assign operator is the most common used.

2.  R has several type of objects, the most basic structures in R are `vectors`, `matrix`, `list`, `data.frame`. Here is an example creating several of these (each line is enclosed with parenthesis so that R prints the resulting element):
    ```{r creating}
    (a_vector     <- 1:9)
    (another_vect <- c(1, 2, 3, 4, 5, 6, 7, 8, 9))
    (a_string_vec <- c("I", "like", "netdiffuseR"))
    (a_matrix     <- matrix(a_vector, ncol = 3))
    (a_string_mat <- matrix(letters[1:9], ncol=3)) # Matrices can be of strings too
    (another_mat  <- cbind(1:4, 11:14)) # The `cbind` operator does "column bind"
    (another_mat2 <- rbind(1:4, 11:14)) # The `rbind` operator does "row bind"
    (a_string_mat <- matrix(letters[1:9], ncol = 3))
    (a_list       <- list(a_vector, a_matrix))
    (another_list <- list(my_vec = a_vector, my_mat = a_matrix)) # same but with names!
    # Data frames can have multiple types of elements, it is a collection of lists
    (a_data_frame <- data.frame(x = 1:10, y = letters[1:10]))
    ```
    
3.  Depending on the type of object, we can access to its components using indexing:
    ```{r indexing}
    a_vector[1:3] # First 3 elements
    a_string_vec[3] # Third element
    a_matrix[1:2, 1:2] # A sub matrix
    a_matrix[,3] # Third column
    a_matrix[3,] # Third row
    a_string_mat[1:6] # First 6 elements of the matrix. R stores matrices by column.
    
    # These three are equivalent
    another_list[[1]]
    another_list$my_vec
    another_list[["my_vec"]]
    
    # Data frames are just like lists
    a_data_frame[[1]]
    a_data_frame[,1]
    a_data_frame[["x"]]
    a_data_frame$x
    ```
    
4.  Control-flow statements
    ```{r control-flow}
    # The oldfashion forloop
    for (i in 1:10) {
      print(paste("I'm step", i, "/", 10))
    }
    
    # A nice ifelse
    
    for (i in 1:10) {
      
      if (i %% 2) # Modulus operand
        print(paste("I'm step", i, "/", 10, "(and I'm odd)"))
      else
        print(paste("I'm step", i, "/", 10, "(and I'm even)"))
      
    }
    
    # A while
    i <- 10
    while (i > 0) {
      print(paste("I'm step", i, "/", 10))
      i <- i - 1
    }
    ```

5.  R has a very nice set of pseudo random number generation functions. In general, distribution functions have the following name structure:
    a.  Random Number Generation: `r[name-of-the-distribution]`, e.g. `rnorm` for normal, `runif` for uniform.
    b.  Density function: `d[name-of-the-distribution]`, e.g. `dnorm` for normal, `dunif` for uniform.
    c.  Cumulative Distribution Function (CDF): `p[name-of-the-distribution]`, e.g. `pnorm` for normal, `punif` for uniform.
    d.  Inverse (quantile) function: `q[name-of-the-distribution]`, e.g. `qnorm` for the normal, `qunif` for the uniform.
    
    Here are some examples:
     
    ```{r random-numbers}
    # To ensure reproducibility
    set.seed(1231)
    
    # 100,000 Unif(0,1) numbers
    x <- runif(1e5)
    hist(x)
    
    # 100,000 N(0,1) numbers
    x <- rnorm(1e5)
    hist(x)
    
    # 100,000 N(10,25) numbers
    x <- rnorm(1e5, mean = 10, sd = 5)
    hist(x)
    
    # 100,000 Poisson(5) numbers
    x <- rpois(1e5, lambda = 5)
    hist(x)
    
    # 100,000 rexp(5) numbers
    x <- rexp(1e5, 5)
    hist(x)
    ```
    
    More distributions available at `??Distributions`.

For a nice intro to R, take a look at ["The Art of R Programming" by Norman Matloff](https://nostarch.com/artofr.htm). For more advanced users, take a look at ["Advanced R" by Hadley Wickham](http://adv-r.had.co.nz/).
    
    

