【问题标题】:how to assign to the names() attribute of the value of a variable in R如何分配给R中变量值的names()属性
【发布时间】:2010-05-25 19:35:58
【问题描述】:

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

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

可以解决这个问题吗?也许是解析评估技巧?谢谢。

【问题讨论】:

  • 你能举个x的例子吗?
  • 你不能先给 'v' 命名,然后再将其分配给 '"x"'?

标签: r attributes names lvalue


【解决方案1】:

在您提出问题的表格中,不需要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】:

    试试这个:

    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
    

    【讨论】:

    • 我认为这不是托尼想要的。他想为在程序中创建的变量分配名称。
    【解决方案3】:

    Marek 的答案有效,但 Aniko 的问题是一个简单的答案。

    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”中的查询具有相同的名称。

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

    【讨论】:

    • 听起来你需要列表。喜欢queries=list(config=list(query=list(q1,q2,...), results=...)。使用assign,您将一直遇到问题,例如,当您想更改结果中某些列的名称时。
    【解决方案4】:

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

    temp <- get(variable_name)
    
    names(temp)<- array_of_names
    
    assign(variable_name,temp)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 2016-09-27
      • 2021-12-02
      相关资源
      最近更新 更多