MinechaRts #1 (Minecraft + R + Edgar Anderson’s Iris Data)

September 5, 2016
By

Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

How to use R to draw 3D scatterplots in Minecraft? Let’s see.

Minecraft is a game about placing blocks and going on adventures (source). Blocks are usually placed by players but there are add-ons that allow to add/modify/remove blocks through external API.
And this feature is being used in educational materials that show how to use Minecraft to learn Python (or how to use Python to modify Minecraft worlds, see this book for example). You need to master loops to build a pyramid or a cube. And you need to touch some math to build an igloo or a fractal. Find a lot of cool examples by googling ‘minecraft python programming’.

So, Python+Minecraft are great, but how to do similar things in R?
You need to do just three things:

1. Install the Spigot Minecraft Server along with all required dependencies. The detailed instruction how to do this is here.
2. Create a socket connection to the Minecraft Server port 4711. In R it’s just a single line

`conn <- socketConnection(host="localhost", port = 4711, blocking=T, server=F, open="r+")`
3. Send building instructions through this connection. For example

`writeLines("world.setBlocks(0,70,0,10,80,10, 46)", conn)`

will create a cube 11x11x11 made of TNT blocks (id=46 is for TNT, see the full list here) placed between coordinates (0,70,0) (10,80,10). You can add and remove blocks, move players, spawn entities and so on. See a short overview of the server API.

The R code below creates a connection to the minecraft server, builds a flat grassland around the spawning point and plots 3d scatterplot with 150 blocks (surprise surprise, blocks coordinates correspond to Sepal.Length, Sepal.Width, Petal.Length variables from the iris dataset).

```#
# A useful function
addBlock <- function(x, y, z, b, conn) {
writeLines(paste0("world.setBlock(",round(x),",",round(y),",",round(z),",",round(b),")"), conn)
}

#
conn <- socketConnection(host="localhost", port = 4711, blocking=TRUE, server=FALSE, open="r+")
baseline <- 70

#
# Add two layers of grass and wipe out everything above
writeLines(paste0("world.setBlocks(-80,",baseline-2,",-80,180,",baseline,",180,2)"), conn)
writeLines(paste0("world.setBlocks(-50,",baseline+1,",-50,150,",baseline+50,",150,0)"), conn)

#
# And now add blocks based on iris data
for (i in 1:nrow(iris)) {
baseline + 2 + 10*(iris[i,"Sepal.Width"] - min(iris[,"Sepal.Width"])),
10*iris[i,"Petal.Length"],
c(41,42,45)[as.numeric(iris[i,"Species"])],
conn)
}```

If you do not like scatterplots try barcharts

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.