【问题标题】:R - Please explain this code and how to make a function that outputs like it?R - 请解释这段代码以及如何制作一个输出类似它的函数?
【发布时间】:2015-05-12 11:22:43
【问题描述】:

我是 R 新手,主要使用其他人编写的旧代码。我正在尝试创建自己的 R 函数。

我发现了以下一些用于特征值分解的代码。

eigenMatrix = eigen(myMatrix)[[2]]
eigenVals = eigen(myMatrix)[[1]]

这里有一个函数可以输出两种不同的数据结构,即一个向量和一个矩阵,具体取决于括号中的值。

当我搜索具有多个输出的函数时,他们通常使用列表来一次输出多个变量,这不起作用,可能是因为类型不同。

我不明白为什么会有两组括号以及底层函数如何工作。

【问题讨论】:

  • 您应该阅读 R 中的列表。基本上使用双括号可确保您获得固有类型。当只使用一组括号时,无论底层结构如何,都会得到一个列表。
  • 谢谢,我发现的大多数帖子都让我感到困惑,直到我找到了这个stackoverflow.com/questions/2050790/…,它专门解释了返回列表确切值的双括号。顺便问一下,既然我明白了答案,我应该怎么处理这个问题?
  • 另外,在示例代码中调用 eigen 两次是否有性能损失?
  • 是的,因为它运行该函数两次。 myList = eigen(myMatrix) 然后 eigenMatrix = emyList[[2]], eigenVals = emyList[[1]] 运行得更快。因为它获取结果列表并获取值。谢谢。
  • 如果你找到了你喜欢的答案,你应该在这里写下答案并选择你自己的答案作为解决方案,这样人们就可以理解答案是什么。

标签: r rstudio


【解决方案1】:

发布的代码采用 eigen 函数,该函数返回一个包含 2 个值的列表。 然后 [[]] 用于从列表中提取第一项和第二项。 [[]] 是返回底层结构所必需的,这里有更好的解释:How to Correctly Use Lists in R?

另外,由于特征函数运行两次,问题中的代码效率低。

resultList = eigen(myMatrix)
eigenMatrix = resultList[[2]]
eigenVals = resultList[[1]]

此代码更好,因为 eigen 只运行一次并将函数的结果保存为列表,然后从列表中读取值。

对于函数本身可以编码为具有多个输出的任何函数,例如这里:https://stat.ethz.ch/pipermail/r-help/2007-March/126851.html 或这里:How to assign from a function with multiple outputs?

列表值可以包含任何结构,[[]] 可用于返回每个值的底层结构。

【讨论】:

  • 你应该选择这个答案作为解决方案。
猜你喜欢
  • 2022-06-11
  • 2022-12-17
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多