2016-04-13 4 views
0

В моем коде я должен создать объект присвоения некоторые значения, что-то вроде этого:Назначение с помощью Get() и пасту()

assign(paste("a","bis",sep="."),rep(NA,5)) 

тогда я должен заменить некоторые из них, как это:

get(paste("a","bis",sep="."))[1:2] <- 7:8 

Но я получаю следующее сообщение об ошибке: «Ошибка в получении (« a »,« bis », sep =«. »)) [1: 2] < - 7: 8: цель назначения расширяется до неязычный объект ".

Конечно, приведенный выше код является упрощенной версией реального. Я пытаюсь создать цикл, который позволяет мне заменить в кадре данных результаты некоторых вычислений. Что-то вроде этого

assign(paste(country[j],"ext",sep="."), 
     data.frame(Year=rep(unique(get(country[j])$Year),each=24), 
     Age=rep(c(0,1,seq(5,110,5)),length(unique(get(country[j])$Year))), 
     mx=NA,qx=NA,lx=NA,Lx=NA,Tx=NA,ex=NA)) 

get(paste(country[j],".ext",sep=""))$mx[(24*i-24+1):(24*i)] <- 
    c(subset(get(country[j]),Age<=70 & Year==year)$mx,mx.ext) 

в этом случае ошибка указывает на то, что: * Ошибка в ГЭТ (паста (страна [J], ".ext", сентябрь = "")) $ х [(24 * я - 24 + 1) :(24 *: не удалось найти функцию "получить < -" *

заранее спасибо

+0

rawr немного дразнит меня, потому что эта проблема - немного мое домашнее животное. Вы нарисовали себя в углу, так сильно полагаясь на 'get' и' assign'. Однако часто бывает трудно помочь в этих обстоятельствах, потому что решение - это своего рода реорганизация всего вашего подхода, который часто выходит за рамки одного вопроса SO. – joran

+1

@rawr [Здесь] (http://stackoverflow.com/a/36336614/324364) это, я думаю. – joran

ответ

2

Вы бы лучше экономить эти элементы в списке

myList <- list() 
myList[[paste("a","bis",sep=".")]] <- rep(NA,5)) 

.. или

myList[[paste(country[j],"ext",sep=".")]] <- data.frame(Year=rep(unique(get(country[j])$Year),each=24), 
          Age=rep(c(0,1,seq(5,110,5)),length(unique(get(country[j])$Year))), 
          mx=NA,qx=NA,lx=NA,Lx=NA,Tx=NA,ex=NA)) 

Это избавляет вас от болей get() и assign(), а также помещает ваши данные в хорошую структуру для циклирования/применения.

+0

Замечательный, он отлично работает. Итак, основная идея в подобных проблемах - использовать список вместо назначения, не так ли? Какой из них лучше всего использовать для присвоения и получить по вашему мнению? – vmgarciag

+0

@vmgarciag Я бы сказал, что вышеупомянутый метод почти всегда предпочтительнее назначать. См. Следующее сообщение: [http://stackoverflow.com/questions/17559390/why-is-assign-bad][assign] – lmo

+0

@vmgarciag Иногда я использую 'get', когда мне нужно использовать строку в какой-то момент, возможно с 'paste' для доступа к некоторому объекту, обычно в самозаписываемой функции. Скорее всего, это лень с моей стороны, которая может быть переработана в вышеуказанный подход. – lmo