【问题标题】:R get() function errorR get() 函数错误
【发布时间】:2013-02-24 14:04:25
【问题描述】:

我正在尝试填充一组 矩阵(对象)名称保存在列表中的矩阵。我能 使用 get() 返回具有给定名称的对象,但我 当我使用 get() 定义矩阵时遇到函数问题 我正在尝试填充的对象。

#Create list of matrix names:
list.names <- c("m.1")

#Create matrix object
m.1 <- matrix(nrow=2,ncol=2)

#Return matrix m.1 from the list.names using get(). Works great!
get(list.names[1])

#Populate m.1 with some values. Doesn't work.
get(list.names[1]) <- c(1,2,3,4)

所以在最后一行代码中,我得到了一个错误:

找不到函数“get

同样,我可以使用以下方式调用 m.1:

eval(as.name(list.name[1]))

但当我尝试填充矩阵时,R 会返回类似的“找不到函数”错误。

有人可以在这里解释我的方法中的错误吗?

编辑/更新:

因此,在我尝试简化此处发布的问题时,我意识到我可能过于简化了我正在尝试做的事情。

所以,事实上,我正在尝试在一组矩阵中​​填充元素。矩阵的名称包含在 list.names 对象中。我正在使用嵌套的 for() 循环来填充矩阵中的每个元素。

所以,事实上,我的问题可以更准确地表述为:

get(list.names[1])[1,1] <- some_value

一些回复建议我根据我的原始帖子使用分配,但考虑到我正在尝试“分配”对象中的一个元素而不是整个对象,这种方法将不起作用。

很抱歉给您带来了困惑。

【问题讨论】:

  • 我想你想要assign,就像assign(get(list.names[1]), 1:4)一样。我无法解释具体细节,但解释听起来可能类似于:从get返回的对象没有错误所指示的赋值 (&lt;-) 方法。所有这些都需要注意,您几乎不需要这种体操来达到类似的结果。在另一个问题中对此进行扩展可能会产生一些更好的答案、理解和代码。
  • @Justin 不完全是。是get() 没有赋值函数,而不是get() 返回的对象。本质上没有'get&lt;-'() 函数,因此没有错误。解析器会看到这种结构并将其转换为对 'get&lt;-'(x = list.names[1], value = c(1,2,3,4)) 的调用,然后它甚至会评估参数,因此会出现关于没有函数 "get&lt;-" 的错误。

标签: r


【解决方案1】:

使用函数assign代替get

assign(list.names[1],c(1,2,3,4))

get 返回一个对象的值,assign 赋值。 :)

eval 相同,它只是评估您的呼叫。

【讨论】:

  • 谢谢大家。可以使用分配来更改/填充对象中的单个元素吗?实际上,我的代码是一系列嵌套循环,我在其中使用辅助函数来生成元素值。我试过了:assign(list.names[1][1,1],1) 没有运气。
  • 您可能想查看withwithin,...assign 创建一个具有名称的对象,而withwithin 允许访问内部组件。为什么不对您的问题进行更准确的描述?
【解决方案2】:

这在 FAQ 7.21 中得到解决。该常见问题解答中最重要的部分是它说使用列表的结尾(一个真实的列表,而不是您在上面调用列表的向量)。如果您在全球工作空间中有一个矩阵列表而不是一堆矩阵,那么很多事情都会变得容易得多。这是一个例子:

mnames <- c('m.1','m.2','m.3')
m.1 <- matrix(1, 2, 2)
m.2 <- matrix(2, 2, 2)
m.3 <- matrix(3, 2, 2)

## put matricies into a list
mymats <- lapply( mnames, get )
names(mymats) <- mnames

## change 1 value in each matrix a different way
mymats[['m.2']][1,1] <- 22
mymats[[1]][2,2] <- 11
tmp <- "m.3"
mymats[[tmp]][1,2] <- 33

## change the same element in each matrix using a loop
for( i in seq_along(mymats) ) {
 mymats[[i]][2,1] <- 44
}

## apply the same function to every matrix and simplify the output
sapply( mymats, rowMeans )

这比摆弄getassign 要简单得多。

【讨论】:

    猜你喜欢
    • 2016-04-23
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多