applyTransformations <- function(read_html){
	params <- read_html$params
	shapes <- read_html$shapes
	tform <- read_html$tform
	# Get total number of iterations in shapes
	n_iter <- c()
	for(lnum in 1:length(shapes)){
		if(is.null(shapes[[lnum]][['xyz']])) next
		if(shapes[[lnum]][['type']] == 'path') next
		xyz <- shapes[[lnum]][['xyz']]
		if(length(dim(xyz)) == 2){
			n_iter <- c(n_iter, nrow(xyz))
		}else if(length(dim(xyz)) == 3){
			n_iter <- c(n_iter, dim(xyz)[3])
		}
	}
	shapes_n_iter <- max(n_iter)
	if(is.null(read_html$tform[['rotate']]) && is.null(read_html$tform[['translate']])){
		read_html[['n.iter']] <- shapes_n_iter
		return(read_html)
	}
	# Get total number of iterations in transformations
	if(!is.null(tform[['rotate']])) rotate_n_iter <- dim(tform[['rotate']])[3]
	if(!is.null(tform[['translate']])) translate_n_iter <- dim(tform[['translate']])[1]
	# Set total number of iterations as maximum of both
	n_iter <- max(c(shapes_n_iter, rotate_n_iter, translate_n_iter))
	
	if(length(tform[['translate']]) > 0){translate <- TRUE}else{translate <- FALSE}
	if(length(tform[['rotate']]) > 0){rotate <- TRUE}else{rotate <- FALSE}
	# Add 0 rows to match number of iterations
	if(translate) if(nrow(tform[['translate']]) < n_iter) tform[['translate']] <- rbind(tform[['translate']], matrix(0, nrow=n_iter-nrow(tform[['translate']]), ncol=3))
	#t1 <- proc.time()
	for(lnum in 1:length(shapes)){
		
		if(is.null(shapes[[lnum]][['xyz']])) next
		if(shapes[[lnum]][['type']] == 'path') next
		xyz <- shapes[[lnum]][['xyz']]
		xyz_dim <- dim(shapes[[lnum]][['xyz']])
		# Expand xyz values to new number of iterations
		if(length(xyz_dim) == 2){
			if(xyz_dim[1] == 1){
				shapes[[lnum]][['xyz']] <- matrix(xyz, nrow=n_iter, ncol=xyz_dim[2], byrow=TRUE)
			}else{
				for(i in 1:(round(n_iter/xyz_dim[1])-1)) xyz <- rbind(xyz, xyz)
				shapes[[lnum]][['xyz']] <- xyz
			}
		}else if(length(xyz_dim) == 3){
			if(xyz_dim[3] == 1){
				shapes[[lnum]][['xyz']] <- array(xyz, dim=c(xyz_dim[1:2], n_iter))
			}else{
				shapes[[lnum]][['xyz']] <- array(xyz, dim=c(xyz_dim[1:2], n_iter))
			}
		}
		# Get new dimensions
		xyz_dim <- dim(shapes[[lnum]][['xyz']])
		# Apply rotations -- this part is slow for a lot of iterations, can't figure out how to do it without for loops
		# will probably need to use compiled code
		if(rotate){
			if(length(xyz_dim) == 2){
				for(iter in 1:rotate_n_iter){
					r <- matrix(shapes[[lnum]][['xyz']][iter, ], ncol=3, byrow=TRUE) %*% tform[['rotate']][, , iter]
					shapes[[lnum]][['xyz']][iter, ] <- t(r)
				}
			}else if(length(xyz_dim) == 3){
				for(iter in 1:rotate_n_iter){
					shapes[[lnum]][['xyz']][, , iter] <- shapes[[lnum]][['xyz']][, , iter] %*% tform[['rotate']][, , iter]
				}
			}
		}
		# Apply translations
		if(translate){
			if(length(xyz_dim) == 2){
				shapes[[lnum]][['xyz']] <- shapes[[lnum]][['xyz']] + matrix(tform[['translate']], nrow=xyz_dim[1], ncol=xyz_dim[2], byrow=TRUE)
			}else if(length(xyz_dim) == 3){
				tarr <- array(apply(tform[['translate']], 1, 'matrix', nrow=xyz_dim[1], ncol=xyz_dim[2], byrow=TRUE), dim=xyz_dim)
				shapes[[lnum]][['xyz']] <- shapes[[lnum]][['xyz']] + tarr
			}
		}
	}
	
	#t2 <- proc.time()
	#print(t2-t1)
	rlist <- list(
		'params'=params,
		'shapes'=shapes,
		'tform'=tform,
		'n.iter'=n_iter,
		'z.index'=read_html$z.index
	)
	
	return(rlist)	
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.