как присвоить атрибуту names () значение переменной в R - PullRequest
3 голосов
/ 25 мая 2010

В R "assign ('x', v)" устанавливает объект с именем 'x' в v. Замените 'x' результатом применения текстовой функции к переменной x. Затем «назначить» показывает свою ценность.

К сожалению, "assign (paste ('names (', 'x', ')', sep = ''), v)" завершается неудачно. Поэтому, если «x» является переменной x, я могу установить ее значение, но не могу дать ей имена для ее элементов.

Можно ли обойти это? трюк с анализом? Спасибо.

Ответы [ 4 ]

5 голосов
/ 26 мая 2010

В форме, которую вы задаете вопрос, нет необходимости assign имен. Если вы x существует, значит, вы names(x) <- v. Это правильный способ сделать это.

Если имя вашей переменной неизвестно (то есть динамически создано), тогда вы можете использовать substitute

nm <- "xxx" # name of your variable
v <- 1:3 # value
assign(nm,v) # assign value to variable

w <- c("a","b","c") # names of variable
eval(substitute(names(x)<-w, list(x=as.symbol(nm))))
# Result is
str(xxx)
# Named int [1:3] 1 2 3
# - attr(*, "names")= chr [1:3] "a" "b" "c"

Но если вы должны делать подобные трюки, то с вашим кодом что-то не так.

4 голосов
/ 28 мая 2010

Ответ Марека работает, но вопрос Анико - простой ответ.

nm <- "xxx"; v<- 1:3; names(v) <- c("a","b","c"); assign(nm,v)

Это ответ Анико, она должна получить кредит.

Случай, в котором я использую это, имеет> 1 классов запросов, каждый с разным именем переменной, и каждый класс, содержащий> 1 sql запроса. Так, скажем, имя класса запроса «config_query» с тремя именованными запросами в списке, скажем, «q1», «q2», «q3». И дальнейший запрос имен классов. Я хочу создать цикл, который будет принимать корневые префиксы (например, «config» для «config_query») имен классов запросов в виде списка, получать их содержимое запросов, выполнять запросы и перечислять кадры данных результата в именах классов результатов например, «config_result», так что каждый результат в «config_result» имеет то же имя, что и запрос в «config_query», результатом которого является.

Говоря иначе, я хочу, чтобы имена классов результатов и соответствующие сопоставления имен были бесплатными, учитывая префиксы root и начальные запросы. Использование assign () присваивает результирующие имена классов. Я застрял на том, как сделать сопоставления имен. Спасибо!

4 голосов
/ 25 мая 2010

Попробуйте это:

assign(paste(names(x),collapse="."), v)

Используйте collapse вместо нескольких имен.

> v <- 1:10
> names(v) <- letters[1:10]
> v
 a  b  c  d  e  f  g  h  i  j 
 1  2  3  4  5  6  7  8  9 10 
> assign(paste(names(v), collapse=""), v)
> abcdefghij
 a  b  c  d  e  f  g  h  i  j 
 1  2  3  4  5  6  7  8  9 10
0 голосов
/ 05 июня 2014

Если имя переменной хранится в виде строки в другой переменной (variable_name), я сделаю следующее.

temp <- get(variable_name)

names(temp)<- array_of_names

assign(variable_name,temp)
...