2

解決策はコメントを参照してください、「Rのバージョンを更新してサーバーを再起動した後、この問題はなくなりました。二度と戻らないかもしれません。スコープまたはローカル/グローバル環境に問題はなく、バグがいくつかありました。指摘してくれた@MrFlickに感謝します私を正しい方向に。


tidyr (および plyr、dplyr、およびその他の Hadleyverse パッケージ) をカスタム関数に組み込むのに役立つように、人々が説明できるかどうか (または、新しいプログラマーに優しいドキュメントまたはテキストを指摘するかどうか) に興味があります。以下の問題には、私が完全に把握していないスコープ/ローカル環境の問題が明らかに含まれています。

前もって感謝します!

再現可能な例

messy <- data.frame(
  name = c("Wilbur", "Petunia", "Gregory"),
  a = c(67, 80, 64),
  b = c(56, 90, 50)
)

カスタム関数の外では、tidyr を使用しています。

library(tidyr); library(dplyr)
messy %>%
  gather(drug, heartrate, a:b) %>%
  dplyr::arrange(desc(drug))

messy %>%
  gather(drug, heartrate, 2:do.call("ncol",list(messy))) %>%
  dplyr::arrange(desc(drug))

どちらも次を返します。

     name drug heartrate
1  Wilbur    b        56
2 Petunia    b        90
3 Gregory    b        50
4  Wilbur    a        67
5 Petunia    a        80
6 Gregory    a        64

これらのタイプの操作は、より大規模で複雑なカスタム関数では明らかに非常に便利ですが、次の問題が発生します。

foo1 <- function(DF){

  DF %>%
    gather(drug, heartrate, 2:ncol(DF)) %>%
    dplyr::arrange(desc(drug))

}

foo2 <- function(DF){

  DF %>%
    gather(drug, heartrate, 2:do.call(ncol,list(DF))) %>%
    dplyr::arrange(desc(drug))

}

foo1(messy)
  Error in ncol(DF) : object 'DF' not found 
foo2(messy)
  Error in do.call(ncol, list(DF)) : object 'DF' not found 

foo2 の do.call バージョンは、同様の最近の stackoverflow 投稿に動機付けられていますが、最終的にはそれほど役に立ちませんでした。


悪い回避策

私が使ってきた恐ろしい解決策の 1 つは、グローバル変数を作成することです。

fooLISH <- function(DF){
  NCOLS <<- ncol(DF)

  DF %>%
    gather(drug, heartrate, 2:NCOLS) %>%
    dplyr::arrange(desc(drug))
}

または、追加の引数をカスタム関数に渡します。


しかし、私はこの質問を、私やこの問題に遭遇した他の人たちへの教訓として利用したいと思っています.


から得られる結果sessionInfo()

R version 3.1.1 (2014-07-10)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C         LC_TIME=C            LC_COLLATE=C         LC_MONETARY=C        LC_MESSAGES=C       
 [7] LC_PAPER=C           LC_NAME=C            LC_ADDRESS=C         LC_TELEPHONE=C       LC_MEASUREMENT=C     LC_IDENTIFICATION=C 

attached base packages:
[1] splines   stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] tnet_3.0.11      survival_2.37-7  igraph_0.7.1     tidyr_0.2.0      RODBC_1.3-10     ggplot2_1.0.0    plyr_1.8.1       reshape2_1.4    
 [9] data.table_1.9.2 dplyr_0.2       

loaded via a namespace (and not attached):
 [1] MASS_7.3-34      Rcpp_0.11.2      assertthat_0.1   colorspace_1.2-4 digest_0.6.4     grid_3.1.1       gtable_0.1.2     labeling_0.2    
 [9] magrittr_1.0.1   munsell_0.4.2    parallel_3.1.1   proto_0.3-10     scales_0.2.4     stringi_0.4-1    stringr_0.6.2    tools_3.1.1  
4

0 に答える 0