【问题标题】:How to assign a value to a matrix created with assign() in R如何将值分配给在 R 中使用 assign() 创建的矩阵
【发布时间】:2015-04-08 21:40:14
【问题描述】:
m <- "mData"
assign(m, matrix(data = NA, nrow = 4, ncol = 5))

现在我想使用变量 m 为 mData 矩阵赋值

assign(m[1, 2], 35) 将不起作用。

任何解决方案将不胜感激?

【问题讨论】:

  • 为什么不跳过中间人直接去m &lt;- matrix(, 4, 5); m[1,2] &lt;- 35assign() 是一个确实不应该用的函数。
  • 还有一个包含这些行的循环。所以 m 随每个循环而变化。每个循环中要分配的值也不同。结果将是许多具有不同名称的矩阵。
  • 这确实是走错路了,但是您可以将名称收集到向量中并使用mget 创建一个矩阵列表。然后使用lapply 对它们应用适当的功能。

标签: r assign


【解决方案1】:

我有点羞于发布这个,但有办法做到这一点。感觉很不对,因为 R 方法是构建一个矩阵列表,然后通过传递一个函数来对它们进行操作,使用 lapply 对其进行转换。

assign.by.char <- function(x,  ...) {
   eval.parent(assign(x,  do.call(`[<-`, list(get(x) , ...)))) }

assign.by.char(m, 1,2,35)
     [,1] [,2] [,3] [,4] [,5]
[1,]   NA   35   NA   NA   NA
[2,]   NA   NA   NA   NA   NA
[3,]   NA   NA   NA   NA   NA
[4,]   NA   NA   NA   NA   NA

【讨论】:

  • 觉得惭愧的真的是我。您的代码运行良好。谢谢!但我不太了解'eval.parent()'和'[
  • [&lt;-( arg1, arg2,arg3,arg4)arg1[arg2,arg3] &lt;- arg4 相同,只是它是以函数形式编写的。 eval.parent 指定参数的评估将在调用环境中进行。它是一种使分配保持在通常不会在函数体内触及的环境中的机制。这样做会使函数看起来像通过副作用工作。那是在道德上被认为是可疑的部分。大多数 R 都是使用返回值的函数完成的,然后将值分配给 R 名称。
【解决方案2】:

如果你真的需要使用assign(),你可以使用replace()

m <- matrix(, 3, 3)
assign("m", replace(m, cbind(1, 2), 35))
m
#      [,1] [,2] [,3]
# [1,]   NA   35   NA
# [2,]   NA   NA   NA
# [3,]   NA   NA   NA

【讨论】:

    【解决方案3】:

    或者你可以直接使用assign(@BondedDust 解决方案的一种变体)

     assign(m, `[<-`(get(m), cbind(1,2), 35))
     mData
     #     [,1] [,2] [,3]
     #[1,]   NA   35   NA
     #[2,]   NA   NA   NA
     #[3,]   NA   NA   NA
    

    或者作为一个函数

    assign.by.char <- function(x, ...){
      eval.parent(assign(x, `[<-`(get(x), ...)))}
    

    数据

    mData <- matrix(, 3, 3)
     m <- 'mData'
    

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 2021-07-30
      • 2023-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      相关资源
      最近更新 更多