R-将多个函数按元素重叠在一起

R-将多个函数按元素重叠在一起,r,lapply,R,Lapply,在R中,当我在lappy中运行两个函数时,它会在整个列表中运行第一个函数,然后在列表中运行第二个函数。在移动到第二个元素之前,是否可以强制它在列表的第一个元素上运行两个函数 我正在使用函数print和nchar,用于说明——我编写了生成data.frame的更复杂的函数 lapply(c("a","bb","cdd"), function(x) { print(x) nchar(x) }) 输出将是 [1] "a" [1] "bb" [1] "cdd" [[1]] [1

在R中,当我在
lappy
中运行两个函数时,它会在整个列表中运行第一个函数,然后在列表中运行第二个函数。在移动到第二个元素之前,是否可以强制它在列表的第一个元素上运行两个函数

我正在使用函数
print
nchar
,用于说明——我编写了生成data.frame的更复杂的函数

  lapply(c("a","bb","cdd"), function(x) {
    print(x)
    nchar(x)
  })
输出将是

[1] "a"
[1] "bb"
[1] "cdd"
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3
我想要这样的东西:

[[1]]
[1] "a"
[1] 1

[[2]]
[1] "bb"
[1] 2

[[3]]
[1] "cdd"
[1] 3
这可能吗

Juan Antonio Roladan Diaz和cash2都建议使用
列表
,哪种作品:

lapply(c("a","bb","cdd"), function(x) { 
  list(x, nchar(x))
})

[[1]]
[[1]][[1]]
[1] "a"

[[1]][[2]]
[1] 1


[[2]]
[[2]][[1]]
[1] "bb"

[[2]][[2]]
[1] 2


[[3]]
[[3]][[1]]
[1] "cdd"

[[3]][[2]]
[1] 3
但它有点太乱了

使用打印可以获得更好的结果

lapply(c("a","bb","cdd"), function(x) { 
  print(x)
  print(nchar(x))
  })

[1] "a"
[1] 1
[1] "bb"
[1] 2
[1] "cdd"
[1] 3
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

但是有没有办法禁止再次打印出
nchar

这是因为函数打印x,然后返回
nchar(x)
;返回的元素由
lappy
放入一个列表中并返回,然后打印在REPL上


nchar(x)
替换为
print(nchar(x))
。或者,如果希望返回列表,只需从内部函数返回
list(x,nchar(x))

您可以得到类似的结果:
lappy(c(“a”,“bb”,“cdd”),函数(x)list(x,nchar(x));lapply(c(“a”、“bb”、“cdd”),函数(x)c(x,nchar(x))
nchar
是矢量化的。也许您根本不需要
lappy
。@mt1022,谢谢,但nchar仅用于说明目的。。。我有一个生成矩阵的函数…@juanantoniroldánDíaz,谢谢,list有效,c无效,但是输出非常笨拙。。。我现在稍微修改一下我的问题…试试这个:不可见(lappy(c(“a”,“bb”,“cdd”),函数(x){print(x)print(nchar(x))}),它们都有效,谢谢!想知道是否有更清洁的解决方案。如果没有更干净的输出,那么编写另一个函数来合并这两个函数似乎是最好的方法。。。
invisible(lapply(c("a","bb","cdd"), function(x) { print(x); print(nchar(x)) }))