【问题标题】:Assign a value to character named variable with index为具有索引的字符命名变量赋值
【发布时间】:2016-11-28 21:16:19
【问题描述】:

我知道我们可以使用assign 将值分配给字符名称向量。例如

assign("target",1:5)

但是,如果我们想改变target的第一个元素(target可以是向量/矩阵/列表),我们应该怎么做呢? target这里也可以是矩阵,所以我们可以改变一个元素,一行或者一列。 我想做类似的事情

target[1] <- 99

如果我使用

assign("target[1]",99)

它只会生成一个名为target[1]的新对象,值为99。这是一个简单的试用示例

# This function is meaningless, just used to show my situation
# variable_name is a character
example_function <- function(variable_name){
    assign(variable_name,1:5)

    if(rnorm(1)>1){
    variable_name[1] <- 99 #This will not work and I just need some function to achive this purpose
    }
}
example_function("justAname")

【问题讨论】:

  • target[1] &lt;- 99 工作正常...有什么问题?
  • 变量名是由内部函数生成的,所以当我们想更改该变量的一个元素时,我们不知道确切的变量名
  • 函数assign() 所做的是以第一个参数作为名称的新变量。这意味着在assign("target",1:5) 之后,将存在一个名为target 的新变量,其值为1 到5。如果您执行print(target),您将看到您的新变量。因此,执行target[1] &lt;- 99 会将target 视为普通变量,允许您进行赋值。试试看,效果很好
  • 是的,我明白了。我会更新我的帖子来说明我的情况。
  • replace(eval(as.name(variable_name)), 1, 99) 可能

标签: r character


【解决方案1】:

作为替代方法,您可以使用[&lt;- 函数。

f = function(variable_name){
  assign(variable_name,1:5)
  if(rnorm(1)>1){
    `[<-`(eval(as.name(variable_name)),i = 1, value = 99)
  }
  get(variable_name)
}

这也适用于矩阵

f_mat = function(variable_name){
  assign(variable_name,matrix(1:25,nrow = 5))
  if(rnorm(1)>1){
    `[<-`(eval(as.name(variable_name)),i = 1, j = , value = 99) # for 1st row
    # `[<-`(eval(as.name(variable_name)),i = , j = 1, value = 99) # for 1st col
    #specify i and j for ith row jth column
  }
  get(variable_name)
}

和类似的列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2017-09-27
    • 2014-07-24
    相关资源
    最近更新 更多