2013-03-16 5 views
3

У меня есть функция, которая использует readline, чтобы позволить пользователю вводить имя, которое они хотят дать для переменной, которую я буду создавать для них. Назовем это «USER.DEFINED.VARIABLE». Он содержит имя, которое я хочу использовать для другой переменной. Предположим, что «USER.DEFINED.VARIABLE» устанавливается readline как «jimsfilename».Как использовать переменную для обозначения другой переменной в R?

Я знаю, что могу присвоить значение переменной с именем «jimsfilename» с помощью:

assign(USER.DEFINED.VARIABLE,c(1,2,3,4,5)) 

«jimsfilename» теперь будет 1,2,3,4,5 в нем. Однако, как мне теперь суетиться с «jimsfilename», учитывая, что я этого не делаю (до того, как readline присваивает его USER.DEFINED.VARIABLE) знает, как его зовут?

Другими словами, скажем, теперь я хочу добавить 1 к каждому значению в jimsfilename. Я не могу сделать:

USER.DEFINED.VARIABLE <- USER.DEFINED.VARIABLE + 1 # can't do this 

, потому что «USER.DEFINED.VARIABLE» на самом деле имя текстовой строки. Я хочу вместо этого ссылаться на jimsfilename, но все, что у меня есть, это USER.DEFINED.VARIABLE, чтобы указать его. Я уверен, что это что-то просто ...

+0

@Dason, это не дубликат, это только смутно связано ... И сообщение, которое вы упомянули, едва читаемо. –

+3

@ Ferdinand.kraft Затем предложите другой дубликат. Сообщение, с которым я связался, было задано не 24 часа назад, а основная посылка такая же. Ответ заключается в использовании 'get' и' assign'. Вопрос был задан более чем достаточно раз. – Dason

ответ

5

Это зависит немного от того, что вы хотите сделать, но вот пример использования get функции:

x<-1 
get(name)+1 
[1] 2 
assign(name,get(name)+1) 
x 
[1] 2 
0

Вы можете использовать eval и parse. Позднее интерпретирует текст так, как будто это был вход в консоль. Первое оценивает выражение (сгенерированное, например, parse). Пример:

> varname <- "user.defined.variable" 
> varvalue <- 42 
> eval(parse(text=paste(varname, varvalue, sep=" <- ")), envir=.GlobalEnv) 
> ls() 
[1] "user.defined.variable" "varname"    "varvalue"    
> user.defined.variable 
[1] 42 

Отметьте, что я выбрал глобальную среду как место назначения для новой переменной. Вы можете внести соответствующие изменения, если это не так.

Чтобы перейти к новой переменной позже, вы можете использовать as.symbol. Просто оценить его в среде, где вы назначили новую переменную:

> eval(as.symbol(varname), envir=.GlobalEnv) 
[1] 42 

Вы можете также использовать substitute создавать выражения, которые eval можно понять:

> eval(substitute(x+1, list(x=as.symbol(varname))), envir=.GlobalEnv) 
[1] 43 

Чтобы внести изменения в новую переменную, просто Creat присваивания и оценивать их:

> eval(substitute(x <- x*10, list(x=as.symbol(varname))), envir=.GlobalEnv) 
> eval(as.symbol(varname), envir=.GlobalEnv) 
[1] 420 
+1

Я думаю, вы подвергли нового пользователя сложностям языка, которые не нужны и с большей готовностью адресованы с помощью 'get'. –

+0

очень согласен с @DWin. У меня возникает соблазн снизить этот ответ, потому что я думаю, что это действительно плохие советы, хотя я вижу, что это предлагается добросовестно. –

+0

@BenBolker, @DWin. Люди, давайте не будем недооценивать наших новых пользователей ... Когда я был полным новичком в R, я был озадачен всеми этими «deparse''ами и« заменителями ». Но быть подверженным этому воздействию не вызвало у меня никакого эффекта, кроме как побудить меня фактически понять, что происходит. И если бы я понял это (по крайней мере до некоторой степени, бесконечно больше нуля), тогда другие тоже могут это исправить. –

3

Почему не просто все манипуляции с переменной (добавление 1 или другого c hanges) к локальной копии переменной с вашим собственным именем, а затем в конце функции/script/независимо от назначения или другой экономии? Это было бы намного проще, чем создание переменной, а затем использовать get, чтобы получить копию, изменить ее и снова assign.

Еще лучше использовать собственное имя переменной внутри функции, а затем просто вернуть результат и позволить пользователю решить, что назвать его в этой точке. Это намного больше, чем у Rish, но лучше не использовать функцию assign. Большинство вещей, которые можно сделать с помощью assign, можно сделать намного проще, используя список и подписи.

Функции не должны ничего менять в глобальной среде, просто верните любые значения, которые могут потребоваться пользователю, и дайте пользователю возможность выполнить задание.

+0

+1 - да, используйте список. Вместо 'assign' do' aList [[USER.DEFINED.VARIABLE]] <- c (1,2,3,4,5) 'и вместо' get' do 'aList [[USER.DEFINED.VARIABLE]] <- aList [[USER.DEFINED.VARIABLE]] + 1'. – flodel

Смежные вопросы