Hata: R işlevi bulunamadı ...


177

Bu bir SSS sorusudur, bu yüzden lütfen olabildiğince eksiksiz olun. Cevap bir topluluk cevabıdır, bu yüzden bir şeyin eksik olduğunu düşünüyorsanız düzenlemekten çekinmeyin.

Bu soru meta olarak tartışıldı ve onaylandı.

R kullanıyorum ve denedim some.functionama aşağıdaki hata iletisini aldım:

Error: could not find function "some.function"

Bu soru çok düzenli olarak karşımıza çıkıyor. R'de bu tür bir hata aldığınızda, bunu nasıl çözebilirsiniz?


5
Bu soruyu kapatmak için oylamadan önce, ilk önce bu tartışmayı meta'da okuyun: meta.stackexchange.com/questions/101892/…
Andrie

2
Her şey başarısız olursa, temel R ve kurulu paketleriniz için kaynak kodunu açmayı deneyin
nullglob

3
@nullglob Bu biraz aşırı görünüyor :-)
Gavin Simpson

İlgili bir sorum var: stackoverflow.com/questions/23357551/… . Bu durumda, HERHANGİ bir Rkomut başarısız olur, ancak q()! Tavsiye büyük takdir edilecektir!
Aleksandr Blekh

Belki aptalca, ama fonksiyonun çıktısını fonksiyonun kendisi olarak adlandırmamaya dikkat edin. [Deneyim tarafından öğrenildi ...]
user3507584

Yanıtlar:


126

Kontrol etmeniz gereken birkaç şey var:

  1. İşlevin adını doğru yazdınız mı? İsimler büyük / küçük harfe duyarlıdır.
  2. İşlevi içeren paketi yüklediniz mi? install.packages("thePackage")(bunun yalnızca bir kez yapılması gerekir)
  3. Bu paketi çalışma alanına eklediniz mi? require(thePackage)veya library(thePackage)(bu, her yeni bir R oturumu başlattığınızda yapılmalıdır)
  4. Bu işlevin henüz mevcut olmadığı daha eski bir R sürümü mü kullanıyorsunuz?

Bu işlevin hangi pakette bulunduğundan emin değilseniz, birkaç şey yapabilirsiniz.

  1. Doğru paketi yüklediğinizden ve eklediğinizden / yüklediğinizden eminseniz, size hangi paketin içinde olduğunu bildirebilecek bir bilgi kutusu almak için help.search("some.function")veya ??some.functionyazın.
  2. findve getAnywherefonksiyonları bulmak için de kullanılabilir.
  3. Eğer paketi hakkında hiçbir ipucu varsa, kullanabilirsiniz findFniçinde sosaçıklandığı gibi pakette bu cevap .
  4. RSiteSearch("some.function")veya rdocumentation veya rseek ile arama işlevi bulmanın alternatif yoludur.

Bazen R'nin eski bir sürümünü kullanmanız gerekir, ancak daha yeni bir sürüm için oluşturulan kodu çalıştırmanız gerekir. Yeni eklenen işlevler (örneğin R 3.4.0'da hasName) bulunmaz. Daha eski bir R sürümü kullanıyorsanız ve daha yeni bir işlev kullanmak istiyorsanız, paketi kullanabilirsiniz. bu işlevleri kullanılabilir hale getirmek backport'larını kullanabilirsiniz. Ayrıca , backportların git repo'sunda rapor edilmesi gereken işlevlerin bir listesini de bulabilirsiniz . R3.0.0'dan daha eski R sürümlerinin R3.0.0 ve sonraki sürümler için oluşturulmuş paketlerle uyumlu olmadığını unutmayın.


Merhaba Joris, hızlı bir sorum var. R'de yeniyim ama başarıyla yükleyebildim. Komut satırından "göksel" paketinde "cosvol" işlevini kullanmak istiyorum. Fedora veri havuzundan Linux sistemime yüklenen R'mden farklı olarak, "göksel" paketimi "evimdeki" farklı bir dizine indirdim. "Cosvol ()" işlevini her istediğimde, "cosdistCoVol" işlevini bulamadık diyor. R'nin "göksel" paketimde tüm işlevlerin ayrı ayrı indirildiği yönetmenimi nasıl bilmesini sağlayacağımdan emin değilim. Yardımın takdire değer.
Benjamin

İşlev çekirdek / temel R kitaplıklarından birindeyse, bunu güncellemeniz gerekebilir. Benim durumumda, hasNameişlevini kullanmaya çalışıyordum utils. Ancak, 3.3.1 kullanıyordum ve hasName3.4.0'a kadar kullanılmadı. utilsTek başına bir kitaplık olarak güncelleyemediğiniz için , R / R Studio güncellenecek kitaplığım olmadığını söyledi.
mpag

@mpag Bunun nedeni utils paketinin R sürümünün ayrılmaz bir parçası olmasıdır. RSiteSearch ("hasName") kelimesini tam anlamıyla kullanırsanız, ilk giriş, bu işlevi R 3.3.1'de kullanılabilir hale getirecek olan backports paketine bir referanstır. Daha fazla bilgi için github.com/r-lib/backports adresine bakın . Bu dava için bazı bilgiler ekledim, bildirim için
teşekkürler

@JorisMeys bu çok yardımcı. Ayrıca, bu işlevin yardım sayfasında R'ye bir işlev eklendiğinde belgelendirmenin standart bir uygulama olması gerektiğini belirtmek isterim (ör.? HasName). Örneğin ne https://www.rdocumentation.org/packages/utils/versions/3.4.3/topics/hasNamede https://stat.ethz.ch/R-manual/R-devel/library/utils/html/hasName.html"R 3.4.0'da tanıtıldı" diyorum blameGithub depolarına göz atarak onu buldum ve / R / hasName.R ve base / R / match'e bakın. R
mpag

@mpag ya da kelimenin tam anlamıyla ilk vuruşu açıp RSiteSearch("hasName")aynı bilgiye sahip olabilirsiniz. Bu yüzden yıllar önce bu cevaba ekledim. Bilmek yararlı bir hile ;-)
Joris Meys

29

Başka bir sorun, bir NAMESPACE varlığında, paket foo dışa aktarılmamış bir işlevi çalıştırmak için çalışıyor olmasıdır .

Örneğin (yaptım, biliyorum, ama):

> mod <- prcomp(USArrests, scale = TRUE)
> plot.prcomp(mod)
Error: could not find function "plot.prcomp"

İlk olarak, S3 yöntemlerini doğrudan çağırmamalısınız, ancak plot.prcomppaket foo'da aslında bazı yararlı dahili işlev olduğunu varsayalım . Ne yaptığınızı biliyorsanız böyle bir işlevi çağırmak için kullanımını gerektirir :::. Ayrıca işlevin bulunduğu ad alanını da bilmeniz gerekir. Kullanarak getAnywhere()işlevin paket istatistiklerinde olduğunu görüyoruz :

> getAnywhere(plot.prcomp)
A single object matching ‘plot.prcomp’ was found
It was found in the following places
  registered S3 method for plot from namespace stats
  namespace:stats
with value

function (x, main = deparse(substitute(x)), ...) 
screeplot.default(x, main = main, ...)
<environment: namespace:stats>

Şimdi doğrudan şunu kullanarak arayabiliriz:

> stats:::plot.prcomp(mod)

Kullandım plot.prcompAmacı açıklamak için örnek olarak . Normal kullanımda böyle S3 yöntemlerini çağırmamalısınız. Ama dediğim gibi, aramak istediğiniz işlev mevcutsa (örneğin gizli bir yardımcı program işlevi olabilir), ancak a'da namespace, R, hangi ad alanına bakacağınızı söylemediğiniz sürece işlevi bulamayacağını bildirir. .

Bunu aşağıdakilerle karşılaştırın: stats::plot.prcomp Yukarıdaki başarısız olur, çünkü statskullanılırken plot.prcompdışa aktarılmazstats hatalar bize söylediği gibi, :

Hata: 'plot.prcomp', 'ad alanı: istatistiklerden' dışa aktarılan bir nesne değil

Bu aşağıdaki gibi belgelenmiştir:

pkg :: name, pkg ad alanındaki dışa aktarılan değişken adının değerini döndürürken, pkg ::: name dahili değişken adının değerini döndürür.


1
teşekkürler - bu R 3 için yükseltme sonra beni kurtardı could not find function "anova.lm"... stats:::anova.lm()yerine arama ile sabit
ErichBSchulz

Alakalı olmasa da, kullanımına :::tasarım hatası denir ve bu ::tercih edilir. Referans kolayca bulunamıyor.
NelsonGon

1
Saygısızlık @NelsonGon, ::ve :::vardır farklı ve düzenleme değil çalışmak ! plot.prcomp()Fonksiyon değildir sen kullanımına ihtiyaç böylece istatistik ad ihraç :::.
Gavin Simpson

@GavinSimpson Doğru! Saygıdeğer bir geliştiricinin tasarım hatasıyla ilgili sözünü aldım ve asla gerçekten doğrulamamıştım. Belki de bu onların kişisel görüşüydü.
NelsonGon

11

Bir bilgisayar kontrolümdeyken genellikle bu sorunu çözebilirim, ancak bir ızgara ile çalışırken daha fazla sıkıntı yaratır. Bir ızgara homojen olmadığında, tüm kütüphaneler yüklenmeyebilir ve deneyimlerim genellikle bağımlılık yüklenmediği için bir paketin yüklenmemiş olmasıydı. Bunu ele almak için aşağıdakileri kontrol ediyorum:

  1. Fortran kurulu mu? ('Gfortran'ı arayın.) Bu, R'deki birkaç büyük paketi etkiler.
  2. Java kurulu mu? Java sınıfı yolları doğru mu?
  3. Paketin yönetici tarafından kurulduğunu ve uygun kullanıcı tarafından kullanılabildiğini kontrol edin. Bazen kullanıcılar paketleri yanlış yerlere yükler veya doğru kitaplıklara uygun erişim olmadan çalışır. .libPaths()iyi bir çek.
  4. lddPaylaşılan kitaplıklar hakkında emin olmak için R için sonuçları kontrol edin
  5. Sadece gereken her paketi yükleyen ve biraz test yapan bir komut dosyasını periyodik olarak çalıştırmak iyidir. Bu, paket sorununu iş akışında olabildiğince erken yakalar. Bu, test veya birim testi oluşturmaya benzer, ancak çok temel şeylerin çalıştığından emin olmak için bir duman testi gibidir.
  6. Paketler ağ tarafından erişilebilen bir yerde saklanabiliyorsa, bunlar mı? Yapamazlarsa, makineler arasında tutarlı sürümler sağlamanın bir yolu var mı? (Bu OT gibi görünebilir, ancak doğru paket kurulumu doğru sürümün kullanılabilirliğini içerir .)
  7. Paket verilen işletim sistemi için kullanılabilir mi? Ne yazık ki, tüm paketler platformlarda mevcut değildir. Bu, 5. adıma geri döner. Mümkünse, bir paketin uygun bir lezzetine geçerek veya belirli durumlarda bağımlılığı kapatarak farklı bir işletim sistemini idare etmenin bir yolunu bulmaya çalışın.

Bununla biraz karşılaştıktan sonra, bu adımların bazıları oldukça rutin hale gelir. # 7 iyi bir başlangıç ​​noktası gibi görünse de, bunlar kullandığım frekansın yaklaşık sırasına göre listelenmiştir.


2
Emin olmak için faydalı noktalar, ancak "Bir paketi yüklerken neden bir hata alıyorum" için daha fazla yanıt.
IRTFM

@DWin: Belki, ama gerçekten değil. Belirsiz olabilirdim. Bu sorunlar, bir paket yüklenmediği için bir iş bir kılavuzda durma noktasına geldiğinde ortaya çıkar. Bir ızgarada yazılım tutarlılığını korumak zor değildir, ancak kurulum, bakım ve hata ayıklama için iyi bir süreç gerektirir. Bunlar, en azından bir işlev mevcut olmadığında gelen ses ile ilgili olduklarından, her aşamadan çıkan öğelerden sadece bazılarıdır. :)
Yineleyici

6

Paketinizi kontrol ederken bu meydana gelirse (R CMD kontrolü), NAMESPACE'inize bir göz atın.

NAMESPACE öğesine aşağıdaki ifadeyi ekleyerek bunu çözebilirsiniz:

exportPattern("^[^\\\\.]")

Bu nokta (".") İle başlamayan her şeyi dışa aktarır. Bu, noktalardan başlayarak gizli işlevlerinize sahip olmanızı sağlar:

.myHiddenFunction <- function(x) cat("my hidden function")

Bu RStudio benim için başarısız - Hata: '\.' "" [[^ \. "ile başlayan karakter dizisinde tanınmayan bir kaçış
Andrew

1
Yazmadım bir paket kullanırken hata alırsam ne yapabilirim herhangi bir öneri? Paketin kendisi tanımlanmamış bir dahili yöntem kullanmak istiyor gibi görünüyor çünkü muhtemelen yazar yukarıdakileri yapmadı.
Andre Luus

4

Hatayla karşılaştım

Hata: işlev bulunamadı some.function

RStudio ile yaptığım bir paketin R CMD kontrolü yapılırken olur. Ekleyerek buldum

exportPattern ( "")

NAMESPACE dosyasına hile yaptı. Bir sidenote olarak, başlangıçta RStudio'yu belgeleri yapmak için ROxygen kullanacak şekilde yapılandırdım - ve ROxygen'in düzenlemelerimi silmeye devam eden benim için NAMESPACE dosyamı yazacağı yapılandırmayı seçtim. Yani, benim durumumda, Roxygen yapılandırmasından NAMESPACE'in işaretini kaldırdım ve bu hatayı çözmek için NAMESPACE'e exportPattern (".") Ekledim.


1
Ad alanı dosyalarında yaptığınız düzenlemeleri tanıyan ve bozulmadan tutan roxygen2'yi daha iyi kullanırsınız. Ayrıca ad alanı dosyasında exportPattern (".") Kullanılmasını şiddetle öneriyorum. Tek tek dosyalarınızda @export etiketini kullanın, böylece yalnızca dışa aktarılması gereken işlevleri dışa aktarın. Roxygen2, dışa aktarılması gereken tüm işlevleri dışa aktarmak için ad alanını otomatik olarak güncelleyecektir.
Joris Meys

1
Joris - Yorum yapmak için zaman ayırdığınız için gerçekten minnettarım; Yazdıklarına% 100 katılıyorum. Şimdi devtools / roxygen2 kullanıyorum ve dışa aktarmam gereken tüm işlevlere aşağıdakileri ekliyorum: # '@export
swihart 21

4

Bu hata, bazı zorunlu bağımsız değişkenler eksikse (yani yeterli bağımsız değişken sağlamadıysanız) işlevin adı geçerli olsa bile oluşabilir.
Bunu bir Rcpp bağlamında aldım, burada optionnal argümanları ile bir C ++ işlevi yazdım ve R'de bu argümanları sağlamadım. doğru ad için eşleşen işlev, ancak yanlış sayıda bağımsız değişken.

Rcpp Fonksiyonu: SEXP RcppFunction(arg1, arg2=0) {}
R Aramalar:
RcppFunction(0)Hata yükseltir
RcppFunction(0, 0)değil


2

Rdocumentation.org , diğer şeylerin yanı sıra, CRAN'daki tüm paketlerin yanı sıra Bioconductor ve GitHub paketlerinden de işlevleri bulmanızı sağlayan çok kullanışlı bir arama işlevine sahiptir.

resim açıklamasını buraya girin


1

Kullanıyorsanız, parallelMapözel işlevleri köle işlerine vermeniz gerekir, aksi takdirde "işlevi bulamadı" hatası alırsınız.

parallelStartAynı argümanda eksik olmayan bir seviyeye parallelExportgeçerseniz, aynı hatayı alırsınız. Bu yüzden kesinlikle takip edilmelidir:

parallelStart(mode = "<your mode here>", N, level = "<task.level>")
parallelExport("<myfun>", level = "<task.level>")

0

Bu hatayı ad aralığı :: işlev çağrısı ile düzeltebilirsiniz.

comparison.cloud(colors = c("red", "green"), max.words = 100)

için

wordcloud::comparison.cloud(colors = c("red", "green"), max.words = 100)

1
Hata, "karşılaştırma" yerine "karşılaştırma" diyor. İsim alanının sorun olmadığını
sanırım

İyi yer @Joris Meys
Tony Cronin

-1

Aynı hatayı aldım, .99xxx sürümünü çalıştırıyordum, yardım menüsünden güncellemeleri kontrol ettim ve RStudio'yu 1.0x'e güncelledim, sonra hata gelmedi

Çok basit bir çözüm, sadece R Studio'nuzu güncelleyin


1
Doğanın hatanın ne olduğunu ayrıntılı olarak açıklar mısınız? Bu yardımcı olabilir, ancak sadece çok özel durumlarda.
Joris Meys
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.