9

文字列を数値に変換しようとしていますが、 で予期しない動作が発生しましstr_replaceた。最小限の作業例を次に示します。

library(stringr)
x <- c("0", "NULL", "0")

# This works, i.e. 0 NA 0
as.numeric(str_replace(x, "NULL", ""))

# This doesn't, i.e. NA NA NA
as.numeric(str_replace(x, "NULL", NA))

NA私の考えでは、2 番目の例は、ベクトルの 2 番目のエントリを(文字ベクトルの有効な値である) に置き換えるだけなので、機能するはずです。しかし、そうではありません: 内部はstr_replace3 つのエントリすべてを に変換しますNA

何が起きてる?str_replaceandのドキュメントを調べましたstri_replace_allが、明確な説明がありません。

編集:明確にするために、これはR 3.1.3、Windows 7stringr_1.0.0と一緒です。stringi_1.0-1

4

4 に答える 4

5

これはパッケージのバグでしたstringiが、現在は修正stringrされています (元にあることを思い出してくださいstringi- 前者も影響を受けます)。

最新の開発バージョンでは、次のようになります。

stri_replace_all_fixed(c("1", "NULL"), "NULL", NA)
## [1] "1" NA
于 2016-01-30T16:26:00.033 に答える
4

のソースコードを見てくださいstr_replace

function (string, pattern, replacement) 
{
    replacement <- fix_replacement(replacement)
    switch(type(pattern), empty = , bound = stop("Not implemented", 
        call. = FALSE), fixed = stri_replace_first_fixed(string, 
        pattern, replacement, opts_fixed = attr(pattern, "options")), 
        coll = stri_replace_first_coll(string, pattern, replacement, 
            opts_collator = attr(pattern, "options")), regex = stri_replace_first_regex(string, 
            pattern, replacement, opts_regex = attr(pattern, 
                "options")), )
}
<environment: namespace:stringr>

fix_replacementこれはGithubにある find につながります。これも下に置きました。メイン環境で実行すると、 がfix_replacement(NA)返されることがわかりますNA。パッケージの に依存しstri_replace_all_regexていることがわかります。stringi

fix_replacement <- function(x) {
    stri_replace_all_regex(
        stri_replace_all_fixed(x, "$", "\\$"),
        "(?<!\\\\)\\\\(\\d)",
        "\\$$1")
}

興味深いことに、パラメーター ( your 、、および) を指定して実行すると、stri_replace_first_fixedstri_replace_first_regexの両方が返されます。問題は、とが C++ コードであるため、何が起こっているのかを理解するのが少し難しくなることです。c(NA,NA,NA)stringpatternreplacementstri_replace_first_fixedstri_replace_first_regex

stri_replace_first_fixedここで見つけることができます。

stri_replace_first_regexここで見つけることができます。

限られた時間と比較的さびた C++ の知識でわかる限り、関数はを使用して引数をstri__replace_allfirstlast_fixedチェックします。そのドキュメントによると、NA に遭遇するとエラーがスローされます。これを超えて完全に追跡する時間はありませんが、このエラーが原因ですべての NA が異常に返される可能性があると思われます。replacementstri_prepare_arg_string

于 2015-12-17T16:47:46.813 に答える