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))

これが私の機能です。文字列から 'c(...)' を取り除くだけです。

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は、リストまたはベクトルの要素への繰り返し適用と同じであるはずだと思っていました!

4

1 に答える 1

2

あなたが見ている不一致は、単に 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文字ではないものを文字に強制しようとします。
sub a list を渡すと、 が呼び出さas.characterれますlist
呼び出しを渡すと、その が呼び出さas.charactercallます。


関数のように見えますが、入力としてリストを好むstripConcatでしょう。

その場合、その機能には次のことをお勧めします。

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

ただし、文字列を渡すことを計画しているようには見えないため、文字列stripConcatは誤称であることに注意してください。(もちろん、これが問題というわけではありません)

于 2013-05-20T21:34:33.567 に答える