2010-05-25 51 views
2

在R中,“assign('x',v)”将名称为'x'的对象设置为v。将'x'替换为将文本函数应用于变量x的结果。然后“分配”显示其价值。如何分配给R中变量值的names()属性

不幸的是,“assign(paste('names(','x',')',sep =''),v)”失败。所以如果'x'是一个变量x,我可以设置它的值,但我不能给它的元素名称。

能解决这个问题吗?一个分析 - 评估技巧也许?谢谢。

+0

你能举一个x的例子吗? – Shane 2010-05-25 19:53:05

+3

你不能只给'v'的名字给''x''吗? – Aniko 2010-05-26 13:57:47

回答

3

试试这个:

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

我不认为这就是Tony想要的。他希望将名称分配给名称在程序中创建的变量。 – Aniko 2010-05-26 13:57:11

3

在提问的形式中,不需要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" 

但是如果你必须做这样的把戏有什么不对你的代码。

2

马立克的答案有用,但安子的问题是一个简单的答案。

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

这是Aniko的回答,她应该得到功劳。

我使用这种方法的情况有> 1类查询,每个类都有一个不同的varname,每个类包含> 1个sql查询。例如,查询类名称为“config_query”,列表中有三个已命名的查询,例如“q1”,“q2”,“q3”。并进一步查询类名称。我想创建一个循环,它将查询类名称的根前缀(如“config”作为“config_query”)作为列表,获取它们的查询内容,运行查询,并将结果数据框列在结果类varnames中比如“config_result”,这样“config_result”中的每个结果都与“config_query”中的查询具有相同的名称,这是它的结果。

换句话说,我想要结果类varnames和相应的名称映射免费,给定根前缀和初始查询。使用assign()分配给结果类varnames。我被困在如何做名字映射。谢谢!

+0

这听起来像你需要列表。像'queries = list(config = list(query = list(q1,q2,...),results = ...)'。使用'assign'你会遇到问题,例如当你想改变名称对于结果中的某一列。 – Marek 2010-05-29 21:00:09

0

如果变量的名称作为字符串存储在其他变量(variable_name)中,我将执行以下操作。

temp <- get(variable_name) 

names(temp)<- array_of_names 

assign(variable_name,temp)