R Markdown

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.

When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

Including Plots

You can also embed plots, for example:

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.

These functions create and cache the inverse of a matrix.

makeCacheMatrix creates a special “matrix” object that can cache its inverse.

cacheSolve computes the inverse of the special “matrix” returned by makeCacheMatrix.

If the inverse has already been calculated (and the matrix has not changed),

then cacheSolve retrieves the inverse from the cache.

Creates a special “matrix” object that can cache its inverse.

makeCacheMatrix <- function(x = matrix()) {
  i <- NULL  ## Initialize the cached inverse to NULL

  ## Sets the matrix and resets the cached inverse.
  set <- function(y) {
    x <<- y
    i <<- NULL  ## Reset cached inverse when matrix changes
  }

  ## Gets the matrix.
  get <- function() x

  ## Sets the cached inverse.
  setInverse <- function(inverse) i <<- inverse

  ## Gets the cached inverse.
  getInverse <- function() i

  ## Returns a list of functions to set/get the matrix and its inverse.
  list(set = set, get = get,
       setInverse = setInverse,
       getInverse = getInverse)
}


## Computes the inverse of the special "matrix" returned by makeCacheMatrix.
## If the inverse is already cached, it retrieves it from the cache.
cacheSolve <- function(x, ...) {
  i <- x$getInverse()  ## Attempt to retrieve the cached inverse

  if(!is.null(i)) {  ## Check if the inverse is already cached
    message("getting cached data")
    return(i)  ## Return the cached inverse
  }

  data <- x$get()  ## Get the matrix from the special object
  i <- solve(data)  ## Calculate the inverse
  x$setInverse(i)  ## Cache the calculated inverse
  i ## Return the calculated inverse
}