Marc van der Peet
Marc van der Peet

Reputation: 343

Iterate over values in a vector

I try to iterate over a vector to create a set of names. Therefore I do the following:

load <- function() {

#create empty vector for storing website adresses
vector_sites <- c()  
names <- c("lening", "krediet")

for (name in names(names)){
adress_part1 <- "https://www.google.com/trends/explore#q="
adress_part2 <- names[i]
adress_part3 <- "&geo=NL&date=today%203-m&cmpt=q&tz=Etc%2FGMT-2"

total_adress <- paste(adress_part1, adress_part2, adress_part3, sep="")
print(names[i])
vector_sites <- append(vector_sites, total_adress)

}

This does not seem to work however. Any thoughts on where I go wrong?

Upvotes: 0

Views: 87

Answers (2)

scoa
scoa

Reputation: 19867

The problem with your code, as @jeff's answer points out, is that you iterate over name in names but do not use name inside the loop. It should be i in seq_along(names).

However, the bigger problem is that those kind of loops are ineficient and error-prone. @akrun suggestion in the comment is to use paste0, but in a vectorized manner, ie. outside of a loop. Hence :

adress_part1 <- "https://www.google.com/trends/explore#q="
names <- c("lening", "krediet")
adress_part3 <- "&geo=NL&date=today%203-m&cmpt=q&tz=Etc%2FGMT-2"

total_adress <- paste0(adress_part1, names, adress_part3)

> total_adress
[1] "https://www.google.com/trends/explore#q=lening&geo=NL&date=today%203-m&cmpt=q&tz=Etc%2FGMT-2" 
[2] "https://www.google.com/trends/explore#q=krediet&geo=NL&date=today%203-m&cmpt=q&tz=Etc%2FGMT-2"

Upvotes: 1

Jeff
Jeff

Reputation: 738

As @akrun has said, you could simply use paste0(adress_part1, names, adress_part3). For your code to work you would need something like:

load <- function() {

    vector_sites <- c()  
    names <- c("lening", "krediet")

    for (i in seq_along(names)) {
        adress_part1 <- "https://www.google.com/trends/explore#q="
        adress_part2 <- names[i]
        adress_part3 <- "&geo=NL&date=today%203-m&cmpt=q&tz=Etc%2FGMT-2"

        total_adress <- paste0(adress_part1, adress_part2, adress_part3)
        print(names[i])
        vector_sites <- append(vector_sites, total_adress)
    }
    return(vector_sites)
}

For which I added a return statement.

Upvotes: 1

Related Questions