Master [Julia]
1. Data types, data structures and indexing
1.1 Basics
Object, assignment, functions, how to comment and get help
xx = 2x + 2x * 3 # we can use Julia as a calculator!log(1) # Functions help us execute things; we usually have to provide arguments?log # Don't know how a function works? Ask for help1.2 Data types
Numeric (integers or doubles)
my_integer = 1 # Naming objects tipsmy_float = 1.0String
my_string = "blue"Boolean
my_boolean = true1.3 Data classes
Arrays
Arrays are ordered collection of elements.
A 1-dimensional array is a vector.
my_vector = ["blue", "bleu", "azul", "blau"] # 1-dimensional arrayis_french = [false, true, false, false]What happens when we add 1 to a logical vector?
is_french .+ 1In Julia, arrays can contain elements of different types.
my_any_array = ["blue", true, 1, false, 3.0]A 2-dimensional array is a matrix.
reshape(my_vector, (lines, columns)) # reshapes my_vectormy_matrix = reshape(my_vector, (2,2)) # 2-dimensional arrayArrays can also contain other arrays.
my_array_of_arrays = [my_vector, is_french, my_matrix]Tuples
(name_element1 = element1, name_element2 = element2, name_element3 = element3)my_tuple = (word = my_vector, french = is_french)Data frames
DataFrame(vector1, vector2) # bind vectors with the same lengthusing DataFramesmy_df = DataFrame(word = my_vector, french = is_french)| word | french |
|---|---|
| blue | false |
| bleu | true |
| azul | false |
| blau | false |
1.4 Dimensions
size(matrix) # returns the dimensionslength(object) # returns the number of elementssize(my_vector)length(my_vector)size(my_matrix)length(my_matrix)Can you guess the value of the length of my_array_of_arrays?
size(my_array_of_arrays)length(my_array_of_arrays)1.5 Indexing
# 1-dimensionalvector[index]# 2-dimensionalmatrix[row, column]dataframe[row, column]# Multi-dimensionalarray[element][...]tuple[element][...]my_vector[2]my_df[2, 1]my_array_of_arrays[1]my_array_of_arrays[1][2]1.6 Slicing
my_matrix = [34 9; 6 5; 3 50; 43 27; 98 100]my_matrix[my_matrix[:, 1] .> 5, :]2. Files
Absolute paths
C:/Users/RonBumblefootThal/Documents/RFolder/MyFirstProject/Draft/IDon'tKnowWhatI'mDoing/etc.R
Relative Paths
~/I_love_my_project/CoolCode.R
2.1 Working directories
readdir()cd("data-trek-2020")pwd()readdir()2.2 Save/write files
Save a dataframe
soa_tour = DataFrame(country = ["USA", "UK", "FRA", "GER", "BRA"], frequency = [34, 9, 6, 5, 3], continents = ["north_america", "europe", "europe", "europe", "south_america"])| country | frequency | continents |
|---|---|---|
| USA | 34 | north_america |
| UK | 9 | europe |
| FRA | 6 | europe |
| GER | 5 | europe |
| BRA | 3 | south_america |
# Function structureCSV.write(path, object)using CSVCSV.write("data/clean/soa_tour.csv", soa_tour)2.3 Load/read files
From your PC
object = CSV.read(path)soa_tour = CSV.read("data/clean/soa_tour.csv")| country | frequency | continents |
|---|---|---|
| USA | 34 | north_america |
| UK | 9 | europe |
| FRA | 6 | europe |
| GER | 5 | europe |
| BRA | 3 | south_america |
From url to your PC, then read
download("http://remote.repo/data/file.csv", path)object <- read.csv(path)Metabolic rates data: http://sciencecomputing.io/data/metabolicrates.csv
download("http://sciencecomputing.io/data/metabolicrates.csv", "data/raw/metabolicrates.csv")metabolic_rates = CSV.read("data/raw/metabolicrates.csv")3. Control Flow
You already apply control flow when you decide how to go to work during winter.
For example:
You take the metro if it's snowy
You take the metro if it's cold
You walk every other time
Now, let's put that into code!
3.1 Conditional evaluation
Simple if statement
Structure:
if (condition is true) do expressionendExample:
weather = "snowy"if weather == "snowy" println("Take the metro!")endweather = "clear"if weather == "snowy" println("Take the metro!")endIf/else statement
Structure:
if (condition) expression 1else expression 2endExample:
if weather == "snowy" println("Take the metro!")else println("Let's walk!")endNested if /else statement
if (condition 1) expression 1 if (condition 2) expression 2 endendExample:
temperature = -15if weather == "snowy" println("Take the metro!")else if temperature < -20 println("Take the metro!") else println("Let's walk!") endendSimpler alternative:
if weather == "snowy" println("Take the metro!")elseif temperature < -20 println("Take the metro!")else println("Let's walk!")endAdding a condition:
if weather == "snowy" || temperature < -20 println("Take the metro!")else println("Let's walk!")end3.2 For loops
Simple for loops
Using for loops, you can then plan your schedule for a few days.
What we had:
weather = "snowy"temperature = -15But what about this?
weather_vec = ["snowy", "cloudy", "snowy", "clear", "rainy"]temperature_vec = [-15, -23, -2, -40, 5]Does the same code work?
if weather_vec == "snowy" || temperature_vec < -20 println("Take the metro!")else println("Let's walk!")endIterations
for i in iterations expression(i)endfor i in 1:5 println(temperature_vec[i] + 2)endMore generally:
length(temperature_vec)for i in 1:length(temperature_vec) println(temperature_vec[i] + 2)endIf statement inside for loops
Structure:
for i in iterations if (condition) expression1 else expression2 endendExample:
# Previous statementif weather_vec == "snowy" || temperature_vec < -20 println("Take the metro!")else println("Let's walk!")end# Will this work?for i in 1:length(weather_vec) if weather_vec == "snowy" || temperature_vec < -20 println("Take the metro!") else println("Let's walk!") endend3.3 Extras
Some logical operators
Comparisons:
less than (
<)more than (
>)less than or equal to (
<=)more than or equal to (
>=)equal to (
==)not equal to (
!=)
Logic:
not x (
!x)x or y (
x || y)x and y (
x && y)
4. Functions
4.1 Syntax and arguments
Basic syntax
function functionname(argument1, argument2) # Name and arguments result = expression # What the function does return result # What the function returnsend# Define a functionfunction temp_difference(temp1, temp2) # Name and arguments result = temp2 - temp1 # What the function does return result # What the function returnsend# Apply on valuestemp_difference(-5, -15)# Apply on variablestemperature = [-15, -23]temp_difference(temperature[1], temperature[2])Calling (personal) functions within functions
function absolute_temp_difference(var1, var2) result = temp_difference(var1, var2) abs_result = abs(result) return abs_resultendabsolute_temp_difference(temperature[1], temperature[2])4.2 Scope
Variables can exist either in global or local scope.
Remember, the element to return in our function was called abs_result.
# What will this return, outside the function?resultHere is a second example for ecologists who like to count living things:
trees = 4 # global variablesquirrels = 10function count_living_things() birds = 5 # local variable squirrels = 20 return birds, squirrels, treesendcount_living_things() # global and local variables returnedbirds # does not exist in global scopesquirrels4.3 Integration
Combining functions and control flow
Let's come back to our previous example about transportation according to the weather.
Here is the forecast for the week and the weekend:
# Week forecastweather_week = ["snowy", "cloudy", "snowy", "clear", "rainy"]temperature_week = [-15.0, -23.0, -2.0, -40.0, 5.0]# Weekend forecastweather_weekend = ["snowy", "rainy"]temperature_weekend = [-3.0, 2.0]Now, let's build a function that will work with either the week or weekend forecasts.
It will look like:
function transportation for all days of the week/weekend if (snowy or cold) take metro else walk end endend# Previous for loopfor i in 1:length(weather_vec) if weather_vec[i] == "snowy" || temperature_vec[i] < -15.0 println("Take the metro") else println("Just walk") endendfunction choose_transportation(weather, temperature) for i in 1:length(weather) if weather[i] == "snowy" || temperature[i] < -15.0 println("Take the metro") else println("Just walk") end endend# Plan for the weekchoose_transportation(weather_week, temperature_week)# Plan for the weekendchoose_transportation(weather_weekend, temperature_weekend)4.4 Exercise - Planning the week
Exercise to integrate the following:
Functions
Control flow
Files
Write a function to read a file if it exists, downloading it first if it does not exist.
Apply the
choose_transportationfunction to the data in the file
# Pseudocodefunction (file, url) if (file exists) read file else download file read fileend# Useful functions?isfile?CSV.read?downloadForecast data url: https://docs.google.com/spreadsheets/d/e/2PACX-1vSdqGDzfGPygowYRaffMTsVHQz1nejPPyjE2Q1yYIRKPUfhayMTcCMhdzqfbea5IeYKi82aW4NDas_G/pub?gid=0&single=true&output=csvfunction read_if_exists(filename, url) if isfile(filename) CSV.read(filename) else download(url, filename) read_if_exists(filename, url) endendusing CSVfilename = "metabolicrates.csv"url = "https://docs.google.com/spreadsheets/d/e/2PACX-1vSdqGDzfGPygowYRaffMTsVHQz1nejPPyjE2Q1yYIRKPUfhayMTcCMhdzqfbea5IeYKi82aW4NDas_G/pub?gid=0&single=true&output=csv"read_if_exists(filename, url)forecast = read_if_exists(filename, url)choose_transportation(forecast.weather, forecast.temperature)4.5 Extras
Default values
# Define functionfunction add_and_multiply(var1, var2; var3 = 1) result = (var1 + var2) * var3 return resultendadd_and_multiply(1.0, 2.0) # multiplies by 1, as defaultadd_and_multiply(1.0, 2.0, 2.0) # returns erroradd_and_multiply(1.0, 2.0; var3 = 2.0) # proper syntaxControlling return
function add_and_multiply(var1, var2; var3 = 1) addition_result = var1 + var2 multiplication_result = addition_result * var3 return (added = addition_result, multiplied = multiplication_result)endadd_and_multiply(1.0, 2.0, var3 = 2.0)