Создайте имя переменной, используя цикл for - PullRequest
0 голосов
/ 13 мая 2019

Мне нужно создать набор переменных, где переменные должны быть построены на основе 2 частей: а) имя б) число, которое увеличивается со значением [1].Для увеличения числа я использую цикл for.Мне удается создать строку, см. Test1, но не увеличить имя переменной, см. Test2.

Учитывая приведенный ниже код ошибки, я предполагаю, что R не хочет, чтобы я создавал что-то, используя "paste0", который является частьюимя переменной.

Мой R-код:

numbers_for_variable_name <- c(1,2,3)

# Test-1 [works]
# Construct string with increasing number.
for (i in numbers_for_variable_name) {
    cat(paste0("number-", i, "\n"))
}
# Test-2 [does not work]
# Construct variable name with increasing number.
for (i in numbers_for_variable_name) {
    paste0("number-", i) <- "p1"
}

Результат для "test1":

number-1
number-2
number-3

Я получаю ошибку для test2:

Error in paste0("number-", i) <- "p1" : 
  target of assignment expands to non-language object

Ожидаемый результат "test2":

number-1 <- "p1"
number-2 <- "p1"
number-3 <- "p1"

Ответы [ 2 ]

3 голосов
/ 13 мая 2019

Вы должны использовать структуру, которая поставляется с R - список.Вы можете назвать его, легко присвоить ему или применить к нему функции, используя lapply или lapply (или просто выполнить цикл).

numbers_for_variable_name <- c(1,2,3)

myresult <- vector("list", length = length(numbers_for_variable_name))
names(myresult) <- paste("number-", numbers_for_variable_name, sep = "")

for (i in numbers_for_variable_name) {
  myresult[[i]] <- i
}

> myresult
$`number-1`
[1] 1

$`number-2`
[1] 2

$`number-3`
[1] 3

Подмножество:

> myresult[["number-3"]]
[1] 3

ПрименениеФункция для всех элементов списка:

> lapply(myresult, FUN = function(x) x^2)
$`number-1`
[1] 1

$`number-2`
[1] 4

$`number-3`
[1] 9
2 голосов
/ 13 мая 2019

Для того, чтобы код ОП работал, должно быть assign, чтобы присвоить идентификатор значению

for (i in numbers_for_variable_name) {
   assign(paste0("number-", i),  "p1")
 }

Обратите внимание, что идентификаторы с - не являются стандартными, но с _ все в порядке.Итак, если мы хотим получить значение, используйте обратные кавычки

`number-1`
#[1] "p1"

`number-2`
#[1] "p1"

Однако не рекомендуется иметь несколько объектов в глобальной среде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...