R:列表内部向量和外部向量之间的操作

R:列表内部向量和外部向量之间的操作,r,list,vector,R,List,Vector,我有一个由3个元素组成的列表,每个元素是由2个其他元素组成的列表。第一个是四维向量,第二个是字符。下面的代码将生成一个与我刚才描述的完全相同的列表: x <- NULL for(i in 1:3){ set.seed(i); a <- list(sample(1:4, 4, replace = T), LETTERS[i]) x <- c(x, list(a)) } 现在,我有另一个四维向量,比如说y: y <- 1:4 问题:如何以简单优雅的方式创建上述矩阵

我有一个由3个元素组成的列表,每个元素是由2个其他元素组成的列表。第一个是四维向量,第二个是字符。下面的代码将生成一个与我刚才描述的完全相同的列表:

x <- NULL
for(i in 1:3){
  set.seed(i); a <- list(sample(1:4, 4, replace = T), LETTERS[i])
  x <- c(x, list(a))
}
现在,我有另一个四维向量,比如说
y

y <- 1:4
问题:如何以简单优雅的方式创建上述矩阵?我正在寻找一些解决方案,可以使用一些
apply
函数,或者可以以某种我不知道的方式直接使用
sum
函数。

尝试以下方法:

# you can also simply write: sapply(x, function(x) x[[1]]) + y
foo <- function(x)  x[[1]]
sapply(x, foo) + y
虽然我的原始答案更容易理解,但它并不是最有效的,因为对于每个列表元素,调用两个函数调用来提取向量。而如果我们直接使用
'[['
,则只调用一个函数调用。因此,我们可以通过减少函数调用开销来节省时间。当函数很小且不做太多工作时,函数调用开销是显而易见的

R中的运算符本质上是函数。
+
*
等都是算术运算符,你可以通过
?'+'
找到它们。同样,你也可以找到
?'[[['
。如果你现在不能理解,不要太担心。迟早你会找到它的


更新2

我不明白它实际上是如何工作的。当我在控制台简单地请求[[1]]时,我得到的是列表的第一个元素(整数向量和字符值),而不仅仅是向量。我想剩下的应该是
sapply
函数的魔法

啊,如果你在理解<代码> sPiest(或者类似的代码> LePix<代码>)时遇到困难,请考虑下面的内容,但我将从<代码> LePix< /Cord>开始。


output@Zheyuan我想在循环内部(而不是外部)设置种子没有好处。仅供参考,您不需要编写完整的函数定义
sapply(x,`[`,1)
works@Zheyuan:谢谢你给出这样一个完整的答案。它工作得非常完美。虽然我理解它的工作原理-正如你所说,函数
foo
提取列表中的向量-但我不理解它实际上是如何工作的。当我在控制台上简单地要求
[[1]]
时,我得到了列表的第一个元素(整数向量和字符值),不仅仅是向量。我想剩下的应该是
sapply
函数的魔法。我会接受你的答案。谢谢。@zheiyunli是的,我现在了解了引擎盖下发生的事情,并且使用
sapply
lappy
感到更加自信。非常努力,回答非常好!
     [,1] [,2] [,3]
[1,]    3    2    2
[2,]    4    5    6
[3,]    6    6    5
[4,]    8    5    6
# you can also simply write: sapply(x, function(x) x[[1]]) + y
foo <- function(x)  x[[1]]
sapply(x, foo) + y
a <- 1:4
a[2]  # 2
'[['(a, 2)  # 2
output <- vector("list", length = length(x))
for (i in 1:length(x)) output[[i]] <- foo(x[[i]])
> output
[[1]]
[1] 2 2 3 4

[[2]]
[1] 1 4 4 3

[[3]]
[1] 3 1 1 1