Master [Julia]
1. Data types, data structures and indexing
1.1 Basics
Object, assignment, functions, how to comment and get help
x
x = 2
x + 2
x * 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 help
1.2 Data types
Numeric (integers or doubles)
my_integer = 1 # Naming objects tips
my_float = 1.0
String
my_string = "blue"
Boolean
my_boolean = true
1.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 array
is_french = [false, true, false, false]
What happens when we add 1 to a logical vector?
is_french .+ 1
In 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_vector
my_matrix = reshape(my_vector, (2,2)) # 2-dimensional array
Arrays 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 length
using DataFrames
my_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 dimensions
length(object) # returns the number of elements
size(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-dimensional
vector[index]
# 2-dimensional
matrix[row, column]
dataframe[row, column]
# Multi-dimensional
array[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 structure
CSV.write(path, object)
using CSV
CSV.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 expression
end
Example:
weather = "snowy"
if weather == "snowy"
println("Take the metro!")
end
weather = "clear"
if weather == "snowy"
println("Take the metro!")
end
If/else statement
Structure:
if (condition)
expression 1
else
expression 2
end
Example:
if weather == "snowy"
println("Take the metro!")
else
println("Let's walk!")
end
Nested if /else statement
if (condition 1)
expression 1
if (condition 2)
expression 2
end
end
Example:
temperature = -15
if weather == "snowy"
println("Take the metro!")
else
if temperature < -20
println("Take the metro!")
else
println("Let's walk!")
end
end
Simpler alternative:
if weather == "snowy"
println("Take the metro!")
elseif temperature < -20
println("Take the metro!")
else
println("Let's walk!")
end
Adding a condition:
if weather == "snowy" || temperature < -20
println("Take the metro!")
else
println("Let's walk!")
end
3.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 = -15
But 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!")
end
Iterations
for i in iterations
expression(i)
end
for i in 1:5
println(temperature_vec[i] + 2)
end
More generally:
length(temperature_vec)
for i in 1:length(temperature_vec)
println(temperature_vec[i] + 2)
end
If statement inside for loops
Structure:
for i in iterations
if (condition)
expression1
else
expression2
end
end
Example:
# Previous statement
if 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!")
end
end
3.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 returns
end
# Define a function
function temp_difference(temp1, temp2) # Name and arguments
result = temp2 - temp1 # What the function does
return result # What the function returns
end
# Apply on values
temp_difference(-5, -15)
# Apply on variables
temperature = [-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_result
end
absolute_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?
result
Here is a second example for ecologists who like to count living things:
trees = 4 # global variable
squirrels = 10
function count_living_things()
birds = 5 # local variable
squirrels = 20
return birds, squirrels, trees
end
count_living_things() # global and local variables returned
birds # does not exist in global scope
squirrels
4.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 forecast
weather_week = ["snowy", "cloudy", "snowy", "clear", "rainy"]
temperature_week = [-15.0, -23.0, -2.0, -40.0, 5.0]
# Weekend forecast
weather_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
end
end
# Previous for loop
for i in 1:length(weather_vec)
if weather_vec[i] == "snowy" || temperature_vec[i] < -15.0
println("Take the metro")
else
println("Just walk")
end
end
function 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
end
end
# Plan for the week
choose_transportation(weather_week, temperature_week)
# Plan for the weekend
choose_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_transportation
function to the data in the file
# Pseudocode
function (file, url)
if (file exists)
read file
else
download file
read file
end
# Useful functions
?isfile
?CSV.read
?download
Forecast data url: https://docs.google.com/spreadsheets/d/e/2PACX-1vSdqGDzfGPygowYRaffMTsVHQz1nejPPyjE2Q1yYIRKPUfhayMTcCMhdzqfbea5IeYKi82aW4NDas_G/pub?gid=0&single=true&output=csv
function read_if_exists(filename, url)
if isfile(filename)
CSV.read(filename)
else
download(url, filename)
read_if_exists(filename, url)
end
end
using CSV
filename = "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 function
function add_and_multiply(var1, var2; var3 = 1)
result = (var1 + var2) * var3
return result
end
add_and_multiply(1.0, 2.0) # multiplies by 1, as default
add_and_multiply(1.0, 2.0, 2.0) # returns error
add_and_multiply(1.0, 2.0; var3 = 2.0) # proper syntax
Controlling 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)
end
add_and_multiply(1.0, 2.0, var3 = 2.0)