R - применить несколько функций в одном элементе - PullRequest
0 голосов
/ 25 мая 2018

В R, когда я запускаю две функции в lapply, он запускает первую функцию из всего списка, а затем запускает вторую функцию из списка.Можно ли принудительно запустить обе функции на первом элементе списка, прежде чем переходить на второй элемент?

Я использую функции 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

это возможно?

Хуан Антонио Роладан Диас и 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

Но это слишком грязно.

Использование печати дает лучший результат,

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 голосов
/ 25 мая 2018
invisible(lapply(c("a","bb","cdd"), function(x) { print(x); print(nchar(x)) }))
0 голосов
/ 25 мая 2018

Это происходит потому, что функция печатает x, а затем возвращает nchar(x);возвращенные элементы помещаются в список на lapply, возвращаются и распечатываются в REPL.

Заменить nchar(x) на print(nchar(x)).Или, если вы хотите вернуть список, просто верните list(x, nchar(x)) из внутренней функции.

...