2017-01-22 4 views
1

sessionInfo()の出力を並べ替える必要があります。私はlapply()を使ってやろうとしましたが、かなり不足しています。SessionInfo()の出力をRでソートするにはどうすればよいですか?

$R.version 
[1] "arch"   "day"   "language"  "major"   "minor"   "month"   
[7] "nickname"  "os"    "platform"  "status"   "svn rev"  "system"   
[13] "version.string" "year"   

$platform 
NULL 

$locale 
NULL 

$running 
NULL 

$basePkgs 
NULL 

$otherPkgs 
[1] "bit"    "bit64"    "boot"    "car"    "compare"   
[6] "corrgram"   "corrplot"   "cowplot"   "debug"    "directlabels"  
[11] "dplyr"    "foreign"   "Formula"   "ggplot2"   "ggthemes"   
[16] "gmodels"   "hexbin"   "Hmisc"    "installr"   "knitr"    
[21] "lattice"   "lubridate"   "magrittr"   "maps"    "openxlsx"   
[26] "pastecs"   "plotly"   "plyr"    "psych"    "purrr"    
[31] "R2HTML"   "readr"    "readstata13"  "reshape2"   "ResourceSelection" 
[36] "rJava"    "rmarkdown"   "sm"    "stringr"   "survival"   
[41] "tables"   "tibble"   "tidyr"    "tidyverse"   "tufte"    
[46] "tufterhandout"  "vcd"    "xlsxjars"   "xts"    "zoo"    

$loadedOnly 
[1] "acepack"  "assertthat" "backports" "base64enc" "bitops"  "broom"  "caTools"  
[8] "checkmate" "class"  "cluster"  "codetools" "colorspace" "data.table" "DBI"   
[15] "dendextend" "DEoptimR"  "digest"  "diptest"  "evaluate"  "flexmix"  "foreach"  
[22] "fpc"   "gclus"  "gdata"  "gplots"  "gridExtra" "gtable"  "gtools"  
[29] "haven"  "hms"   "htmlTable" "htmltools" "htmlwidgets" "httr"   "iterators" 
[36] "jsonlite"  "kernlab"  "KernSmooth" "latticeExtra" "lazyeval"  "lme4"   "lmtest"  
[43] "MASS"   "Matrix"  "MatrixModels" "mclust"  "mgcv"   "minqa"  "mnormt"  
[50] "modelr"  "modeltools" "munsell"  "mvbutils"  "mvtnorm"  "nlme"   "nloptr"  
[57] "nnet"   "parallel"  "pbkrtest"  "prabclus"  "quadprog"  "quantreg"  "R6"   
[64] "RColorBrewer" "Rcpp"   "readxl"  "registry"  "robustbase" "rpart"  "rprojroot" 
[71] "rvest"  "scales"  "seriation" "SparseM"  "splines"  "stats4"  "stringi"  
[78] "tools"  "trimcluster" "TSP"   "viridisLite" "whisker"  "xml2"  

私たちは、その存在はかなりの数のNULLフィールドを見ることができます:

lapply(sessionInfo(),function (x) {sort(names(x))}) 

私が得た:私は、このコマンドを試してみました。例えば

、。さらに、出力は、我々はおよそ$R(ちょうどsessionInfo()実行することにより、すなわち、も不足しています。)を取得

私はちょうどリストに深い1つのレベルをソートすることは私の情報についてR.version, $platform, $locale, $running

lapply(a,function (x) {lapply(x, function(x){sort(names(x))})}) 
を表示することがありますかどうかを確認するために、別のものを試してみました

これも役に立たなかった。誰か助けてくれますか?ソートされた出力は、欠落しているパッケージをスキャンするためにはるかに優れています。リストの要素はアトミックであれば

+2

に比較しますか? 'sessionInfo()'を実行すると、print関数は特別な方法で情報の一部のみを表示します。 'utils ::: print.sessionInfo' – rawr

+0

@rawr - あなたのお手伝いをしてください。表示されるパッケージがソートされることを除いて、 'sessionInfo()'と同じ出力が必要です。私は後者の部分を持っていますが、 'sessionInfo()'に付属している最初の "ヘッダ"(Rのバージョン、プラットフォームのロケールなど)を失いました – watchtower

+4

実際には順序が重要ですが、本当にソートしたい場合は 'si < - sessionInfo ); si [] < - lapply(si、function(x)if(is.list(x))x [ソート(names(x))] else sort(x));私は働くはずです – rawr

答えて

2
si <- sessionInfo() 
si[] <- lapply(si, function(x) if (is.list(x)) x[sort(names(x))] else sort(x)) 
si 

# R version 3.3.2 (2016-10-31) 
# Platform: x86_64-apple-darwin13.4.0 (64-bit) 
# Running under: OS X El Capitan 10.11.6 
# 
# locale: 
# [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 
# 
# attached base packages: 
# [1] base  datasets graphics grDevices methods stats  utils  
# 
# loaded via a namespace (and not attached): 
# [1] tools_3.3.2 

si[sort(names(si))]は、名前付きリストのために働くだろう。文字ベクトルが

ll <- setNames(letters, letters) 
ll[sort(names(ll))] 
# a b c d e f g h i j k l m n o p q r s t u v w x y z 
# "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z" 

問題はsessionInfo()は、Aが含まれていることであると命名された場合を除き

letters[sort(names(letters))] 
# character(0) 
# Warning message: 
# In is.na(x) : is.na() applied to non-(list or vector) of type 'NULL' 

:たとえば、データフレーム:

str(as.list(mtcars)[sort(names(mtcars))]) 
# List of 11 
# $ am : num [1:32] 16.5 17 18.6 19.4 17 ... 
# $ carb: num [1:32] 2.62 2.88 2.32 3.21 3.44 ... 
# $ cyl : num [1:32] 4 4 1 1 2 1 4 2 2 4 ... 
# $ disp: num [1:32] 6 6 4 6 8 6 8 4 4 6 ... 
# ... 

我々は文字ベクトルでこれを行うことはできませんリストと文字ベクトルの両方のリスト

sapply(si, class) 
# R.version platform  locale  running basePkgs loadedOnly 
# "list" "character" "character" "character" "character"  "list" 

だから、リストをソートするにはちょうどsort

sort(si$basePkgs) 
# [1] "base"  "datasets" "graphics" "grDevices" "methods" "stats"  "utils"  

でもないリスト

sort(si$loadedOnly) 
# Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) : 
# 'x' must be atomic 

で文字ベクトルを並べ替えることができ、我々はこの

のようにソートされた名前とインデックスにリストを使用することができます
(nn <- sort(names(si$loadedOnly))) 
# [1] "tools" 

si$loadedOnly[nn] 

したがって、両方のケースを処理するにはif-elseが必要です

lapply(si, function(x) if (is.list(x)) sort(names(x)) else sort(x)) 
# $R.version 
# [1] "arch"   "day"   "language"  "major"   "minor"   
# [6] "month"   "nickname"  "os"    "platform"  "status"   
# [11] "svn rev"  "system"   "version.string" "year"   
# 
# $platform 
# [1] "x86_64-apple-darwin13.4.0 (64-bit)" 
# 
# $locale 
# [1] "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8" 
# 
# $running 
# [1] "OS X El Capitan 10.11.6" 
# 
# $basePkgs 
# [1] "base"  "datasets" "graphics" "grDevices" "methods" "stats"  "utils"  
# 
# $loadedOnly 
# [1] "tools" 

最後のピースは、class(si)を維持するために、この場合にsiの属性を保持する[] <-なく単に<-の使用です。ここでは、機能[<-を使用している代わりに、通常の<-

si <- sessionInfo() 
si[] <- lapply(si, function(x) if (is.list(x)) x[sort(names(x))] else sort(x)) 
si 

は、あなたがこのことから欲しいんどのような情報

si <- sessionInfo() 
si <- lapply(si, function(x) if (is.list(x)) x[sort(names(x))] else sort(x)) 
si 
関連する問題