解决方案见评论,“更新我的 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