Home > OS >  Assign() to specific indices of vectors, vectors specified by string names
Assign() to specific indices of vectors, vectors specified by string names

Time:10-11

I'm trying to assign values to specific indices of a long list of vectors (in a loop), where each vector is specified by a string name. The naive approach

testVector1 <- c(0, 0, 0)

vectorName <- "testVector1"
indexOfInterest <- 3

assign(x = paste0(vectorName, "[", indexOfInterest, "]"), value = 1)

doesn't work, instead it creates a new vector "testVector1[3]" (the goal was to change the value of testVector1 to c(0, 0, 1)).

I know the problem is solvable by overwriting the whole vector:

temporaryVector <- get(x = vectorName)
temporaryVector[indexOfInterest] <- 1
assign(x = vectorName, value = temporaryVector)

but I was hoping for a more direct approach.

Is there some alternative to assign() that solves this?

Similarly, is there a way to assign values to specific elements of columns in data frames, where both the data frames and columns are specified by string names?

CodePudding user response:

If you must do this you can do it with eval(parse():

valueToAssign  <- 1
stringToParse  <- paste0(
    vectorName, "[", indexOfInterest, "] <- ", valueToAssign
)
eval(parse(text = stringToParse))

testVector1
# [1] 0 0 1

But this is not recommended. Better to put the desired objects in a named list, e.g.:

testVector1 <- c(0, 0, 0)

dat  <- data.frame(a = 1:5, b = 2:6)

l  <- list(
    testVector1 = testVector1,
    dat = dat
)

Then you can assign to them by name or index:


vectorName <- "testVector1"
indexOfInterest <- 3

dfName  <- "dat"
colName  <- "a"
rowNum  <- 3

valueToAssign  <- 1

l[[vectorName]][indexOfInterest]  <- valueToAssign
l[[dfName]][rowNum, colName]  <- valueToAssign

l
# $testVector1
# [1] 0 0 1

# $dat
#   a b
# 1 1 2
# 2 2 3
# 3 1 4
# 4 4 5
# 5 5 6
  • Related