R:tidyr,在将tidyr函数合并到自定义函数中时,可以获得适当的范围和环境

时间:2015-04-13 19:00:48

标签: r scope environment-variables dplyr tidyr

解决方案查看评论" 更新我的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版本受similar recent stackoverflow post的推动,但最终并没有帮助。


糟糕的变通方法

我一直在使用的一个可怕的解决方案是创建一个全局变量

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  

0 个答案:

没有答案