У меня есть 3D-массив с множеством страниц (или как вы называете 3-е измерение).Я пытаюсь вставить этот массив в цикл и перебирать страницы для заполнения значений.
В моем реальном наборе данных я манипулирую значениями с помощью нескольких пользовательских функций, поэтому наилучший способ его работы - минимизировать количество повторного набора, которое мне потребуется при изменении переменных, - создать новый массив внутри.цикл, внесите изменения в этот новый массив, а затем замените новую страницу на месте в исходном массиве.Тем не менее, мне трудно подключить новую страницу обратно в исходный массив.Пример следует.
code="A" # I'll be running this loop with various name codes
assign(paste0("testarray",code),array(dim=c(5,5,20)))
# creates array "testarrayA" . I'm using assign(paste()) because I will
# do this with many different array codes, and I want to only change
# the code value each time for ease
set.seed(5)
testarrayA[,,1] <- runif(25,3,20) #fill first page
Затем я хочу запустить этот массив через цикл для изменения значений на каждой странице.В реальном коде изменения производятся с помощью довольно сложных пользовательских функций, поэтому, опять же, для простоты я начну с создания меньшего массива, его изменения, а затем попытаюсь снова подключиться к массиву сверху.См. Следующее.
# this loop doesn't work at the moment, so just run lines
# inside the loop individually to attempt. set "page" object as 1
for(page in 1:dim(get(paste0("testarray",code)))[3] ){
# for pages 1-end of third dimension (20)
temparray <- get(paste0("testarray",code))[,,page:(page+1)]
# create smaller array of only current and (blank) next page of original array
temparray[,,2] <- temparray[,,1]*2
# do functions to change the values on the next page of temporary array.
# (just multiplying values by 2 for this example)
# try to plug in temporary array[2] as original array[page+1].
# both of these codes give me errors at the moment, but these are
# the options I have tried so far.
# trial 1:
get(paste0("testarray",code))[,,page+1] <- temparray[,,2]
# trial 2:
assign(paste0("testarray",code)[,,page+1],temparray[,,2])
}
Я полагаю, что проблема заключается в невозможности использования paste () на принимающей стороне команды назначить.Первая пробная версия, указанная выше, возвращает ошибку «цель назначения расширяется до неязыкового объекта», которую я не совсем понимаю, как интерпретировать, а вторая - «неверное количество измерений», чего не должно быть.Когда я выделяю и запускаю каждый объект по отдельности, они имеют одинаковые размеры, поэтому я не знаю, что я делаю неправильно.
По сути, мне нужно знать, как использовать paste () на принимающей сторонефункции назначения, такой как <- или assign (), или если есть разумный обходной путь для ошибок, которые я получаю.Я знаю, что мог бы просто опустить создание меньшего временного массива, но в моем реальном коде это сделало бы намного больше работы, потребовав от меня менять имена несколько раз в каждой команде внутри цикла, когда я запускаю новый набор данных,Я бы предпочел просто изменить «код», если это возможно.Спасибо! </p>