Hi I'm just learning to use rstudio and need help creating a sequence of the first 20 triangular numbers using the equation n*(n+1)/2. Thanks!
Hi @graceel! Give this a crack:
n <- 1:20
tri_nums <- n * (1 + 1) / 2
(The :
operator generates regular sequences in intervals of 1, so the first statement there is just generating a vector from 1 to 20.)
If you're feeling adventurous, you can put combine the statements like:
# i mean, i guess (1:20) + 1 is just 2:21
tri_nums <- (1:20) * ((1:20) + 1) / 2
If you use the colon operator inside of a larger statement this way, I'd urge you to be careful and (wrap it in parentheses): some operators have a different precedence (in particular -
and +
depending on how they're read), and you might end up with a confusing bug! Hope that helps
So, based on how you state your question, I'm going to spell it out
# Define the numbers we are going to work on
n = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
# Create empty vector to hold the results
tri_nums = c()
# Loop over each number in n, calculate and append corresponding triangular number
for( n_i in n ){
tri_nums = append(tri_nums, n_i * (n_i + 1) / 2)
}
We can simplify this a bit, by using the seq()
function, recall we can get help on a function by typing ?seq
# See help on seq function
?seq
# Define the numbers we are going to work on
n = seq(from = 1, to = 20, by = 1)
# Create empty vector to hold the results
tri_nums = c()
# Loop over each number in n, calculate and append corresponding triangular number
for( n_i in n ){
tri_nums = append(tri_nums, n_i * (n_i + 1) / 2)
}
Now, du to vectorisation, R
actually let's us skip the loop, like so:
# Define the numbers we are going to work on
n = seq(from = 1, to = 20, by = 1)
# Create empty vector to hold the results
tri_nums = c()
# Loop over each number in n, calculate and append corresponding triangular number
tri_nums = n * (n + 1) / 2
Finally, we use the seq(by = 1)
short hand from:to
and since R
does not require us to define variables prior to assignment, we get the following:
# Define the numbers we are going to work on
n = 1:20
# Loop over each number in n, calculate and append corresponding triangular number
tri_nums = n * (n + 1) / 2
We can compress this even further by simply defining the sequence, inside the expression for calculating the triangular numbers:
# Define the numbers we are going to work on
# Create empty vector to hold the results
# Loop over each number in n, calculate and append corresponding triangular number
tri_nums = 1:20 * (1:20 + 1) / 2
So, basically vectorisation for the win!
Hope it helps
Leon
This topic was automatically closed 21 days after the last reply. New replies are no longer allowed.
If you have a query related to it or one of the replies, start a new topic and refer back with a link.