R - 通过元素在一个lapply中提供几个函数

时间:2018-05-25 10:27:41

标签: r lapply

在R中,当我在lapply中运行两个函数时,它在整个列表上运行第一个函数,然后在列表上运行第二个函数。是否有可能强制它在列表上的第一个元素上运行两个函数,然后再移动到第二个元素上?

我使用函数printnchar用于插图目的 - 我编写了更复杂的函数来生成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都建议使用list,其中有哪些作品:

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

但它太乱了。

使用print可以获得更好的结果,

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再次打印出来?

2 个答案:

答案 0 :(得分:1)

这是因为函数打印x,然后返回nchar(x);返回的元素由lapply放入列表并返回,并在REPL上打印出来。

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

答案 1 :(得分:1)

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