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 帖子推动的,但最终并没有那么有帮助。


糟糕的解决方法

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

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