2015-03-31 16 views
10

Üniversitemde bilgisayar kümemi kullanırken yerel makinemde yeniden oluşturamayacağım bir matris hatası yaşıyorum. Matris kütüphanelerinin (BLAS, LAPACK, ATLAS, vb.) Bir farkından kaynaklanmış olabileceğini düşünüyorum. Bu kütüphaneler hakkında here'u okuduğumdan başka bir şey bilmiyorum, ama sanırım R'nin hangi matris kitaplıklarının yüklü olduğunu (yani, hangisini kullandığını) söylemesini sağlamanın bir yolu olmalı. R paketlerinin hangi sürümünü kullandığını söylemek için sessionInfo() öğesine tıklayın.R yüklememin hangi matris kitaplıklarını kullandığını nasıl belirleyebilirim?

cevap

5

, belki de (kabuk komutları yararlanmak ör öyle dosyanın türünü görmek

(rpath <- Sys.which("R")) 
#   R 
# "/usr/bin/R" 

ldd çalışacaktır emin olmak için:

, file ve ldd) küme üzerinde yeniden inşa R ne de root erişimi gerektirmeden bazı ipuçları elde etmek 210
system2("file", rpath) 
# /usr/bin/R: Bourne-Again shell script, ASCII text executable 

Sizinki gerçek bir yürütülebilir dosyayı (örneğin, ELF 64-bit LSB executable, x86-64, ...) gösterirse, bu adımı atlayın.

script <- readLines(rpath) 
script[grepl("/bin/", script)] 
# [1] "#!/bin/bash" 
# [2] "  if [ -x \"/usr/${libnn}/R/bin/exec/R\" ]; then" 
# [3] "  elif [ -x \"/usr/${libnn_fallback}/R/bin/exec/R\" ]; then" 
# [4] "## some systems have a more portable sed, e.g. /usr/xpg4/bin/sed on Solaris," 
# [5] "SED=/bin/sed" 
# [6] "  exec sh \"${R_HOME}/bin/Rcmd\" \"${@}\" ;;" 
# [7] "R_binary=\"${R_HOME}/bin/exec${R_ARCH}/R\"" 

Bu gerçek yürütülebilir /usr/lib/R/bin/exec/R (veya /usr/lib64/...) olduğunu söylüyor. Bazı çıkarımlar alıyor, ama bu bir adım. Bu ubuntu üzerinde R-3.3.2 ile benim için çalışıyor, bu yüzden sadece farklı işletim sistemleri üzerinde benzer olacağını varsayabilirim. Bu sorunlu ise, aynı zamanda "/lib" veya "/exec" için grep (veya diğer komut dosyaları için tüm komut dosyasını inceleyin).Eğer komut dosyası tarafından çağrılan yolunu öğrendikten sonra (ya da başlamak için bir komut dosyası değilse)

, paylaşılan kütüphane bağımlılıklarını bulmak:

system2("ldd", "/usr/lib/R/bin/exec/R") 
#   linux-vdso.so.1 => (0x00007ffcfadcd000) 
#   libR.so => /usr/lib/R/lib/libR.so (0x00007f746f615000) 
#   libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f746f3eb000) 
#   libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f746f025000) 
#   libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f746eda8000) 
#   libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f746eaa2000) 
#   libreadline.so.6 => /lib/x86_64-linux-gnu/libreadline.so.6 (0x00007f746e85b000) 
#   libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f746e61d000) 
#   liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f746e3fb000) 
#   libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f746e1ea000) 
#   libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f746dfd1000) 
#   librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f746ddc9000) 
#   libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f746dbc4000) 
#   libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f746d9b5000) 
#   /lib64/ld-linux-x86-64.so.2 (0x0000560abd5fa000) 
#   libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f746d78b000) 

Bu çıkışın 5 R hattı olduğunu göstermektedir BLAS kütüphanesini kullanarak, özellikle libblas3.

+0

Kapsamlı ve ayrıntılı cevabınız için teşekkür ederiz. Asla kendi başıma düşünemezdim. R'nin "R --version" gibi bir "benim hakkım" fonksiyonuna sahip olmaması, ama belki de "R - buildoptiyonlar" olarak adlandırılabilmesi utanç verici. – rcorty

-3

Bildiğim kadarıyla farkındayım olarak size BLAS sürümünü verecektir (baz Ar özellikle verilmez) belirli bir işlev yoktur yeterince googling ?: http://www.stat.cmu.edu/~nmv/2013/07/09/for-faster-r-use-openblas-instead-better-than-atlas-trivial-to-switch-to-on-ubuntu/

+0

Cevabınız için teşekkür ederiz. Bu makaleyi okuduğumdan, farklı matris kitaplıkları ile R'nin nasıl oluşturulacağı hakkında bilgi sağlar, ancak varolan bir derlemede hangi matris kitaplığının kullanıldığını bulmama yardımcı olmaz. – rcorty

4

biraz midir. R, muhtemelen sisteminizle birlikte gelen standart kütüphaneyi kullanacaktır (eğer birisi onu belirli bir BLAS versiyonuna sahip bir kaynaktan oluşturmamışsa).

Sen terminalden yapmak zorunda kalacaktı tip

locate libblas.so 

Muhtemelen /usr/lib/libblas.so veya /usr/lib64/libblas.so içinde olacak ve konumu muhtemelen sembolik bağdır. Farklı bir BLAS kütüphaneye işaret sembolik bağlantılarını değiştirmek istiyorsanız Yani bağlantıları

ls -l /usr/lib/libblas.so 

izleyin update-alternatives --config libblas.so.3gf yapmak ve kullanmak istediğiniz sürümü seçebilirsiniz. Bu mesaj daha detaylı olarak çok güzel bunu açıklıyor: https://www.r-bloggers.com/for-faster-r-use-openblas-instead-better-than-atlas-trivial-to-switch-to-on-ubuntu/

kesinlikle istediğiniz BLAS ne olursa olsun uygulama yüklemek olacaktır, kullandığınız hangi sürümü bilmek için başka bir yol - örneğin OpenBLAS için, ve sonra standart R BLAS kütüphane yerine yeni kütüphanenize bir link. Burada açıklandığı gibi, --with-shared-blas seçeneğiyle R yüklemek için emin olun: https://cran.r-project.org/doc/manuals/r-release/R-admin.html#BLAS Sonra sadece ihtiyacımız: Bunun için açık bir Ar işlevi olmayabilir rağmen

# navigate to your R directory 
cd …/path-to-R-installation/lib/R/lib 
# backup the original 
mv libRblas.so libRblas.backup 
# create simlink 
ln –s …/path-to-new-0blas-library/new-lib.so libRblas.so 
+0

Güzel açıklama. Ayrıca, Blas'ın gerçekten problemin sebebi olup olmadığını keşfetmek için bunu kullanabileceğini tahmin ediyorum. Bir dizi Blas kütüphanesi kurarak ve hatayı yineleyip eşlemediğini görmek için tek tek test etmek için sembolik bağlantıyı güncelleyerek. – dww

+0

Cevabınız için teşekkür ederiz. Özellikle, bir makineyi paylaştığım bir kişinin, belirli bir matris matematik kitaplığına sahip R kaynağını oluşturduğu durumla özellikle ilgileniyorum. ATLAS, BLAS, OpenBLAS, vb. Soruma yeterince açık olmasaydım özür dilerim. Ne yaptığını anlayabiliyorsam merak ediyorum. – rcorty

İlgili konular