Sapply отличается от индивидуального применения функции

Обновить

December 2018

Просмотры

115 раз

2

При применении индивидуально к каждому элементу вектора, моя функция дает другой результат, чем при использовании sapply. Это сводит меня с ума!

Пункт Я использую: это (упрощенный) список аргументов другой функция была вызвана:

f <- as.list(match.call()[-1])
> f
$ampm
c(1, 4)

Для того, чтобы повторить это можно выполнить следующие действия:

foo <- function(ampm) {as.list(match.call()[-1])}
f <- foo(ampm = c(1,4))

Вот моя функция. Она просто раздевает «с (...)» из строки.

stripConcat <- function(string) {
    sub(')','',sub('c(','',string,fixed=TRUE),fixed=TRUE)
}

При использовании только одного он работает так, что это то, что я хочу:

> stripConcat(f)
[1] "1, 4"

Но при использовании sapply, это дает что-то совершенно другое, что я не хочу:

> sapply(f, stripConcat)
 ampm
[1,] "c" 
[2,] "1" 
[3,] "4" 

Lapply не работает, либо:

> lapply(f, stripConcat)
$ampm
[1] "c" "1" "4"

И ни один не делать ничего другого применять функции. Это сводит меня с ума, - подумал я lapply и sapply должны были быть идентичны неоднократных обращениях к элементам списка или вектора!

1 ответы

2

Discrepency вы видите, я считаю, это просто из-за того, как as.character принуждают элементы списка.

x2 <- list(1:3, quote(c(1, 5)))
as.character(x2)
[1] "1:3"     "c(1, 5)"

lapply(x2, as.character)
[[1]]
[1] "1" "2" "3"

[[2]]
[1] "c" "1" "5"

f это не призыв, а список, чей первый элемент является вызовом.

is(f)
[1] "list"   "vector"
as.character(f)
[1] "c(1, 4)"

> is(f[[1]])
[1] "call"     "language"
> as.character(f[[1]])
[1] "c" "1" "4"

subпытается заставить что - либо , что не персонаж в chracter.
Когда вы передаете суб список, он вызывает as.characterна list.
Когда вы передаете ему вызов, он звонит as.characterпо этому call.


Похоже , что для stripConcatфункции, вы бы предпочли список в качестве входных данных.

В этом случае я бы рекомендовал следующее для этой функции:

stripConcat <- function(string) {
    if (!is.list(string))
      string <- list(string)
    sub(')','',sub('c(','',string,fixed=TRUE),fixed=TRUE)
}

Однако следует отметить, что строка является неправильным, так как это не кажется , что вы когда - либо планируют передать stripConcatстроку. (не то, что это вопрос, конечно)