ข้อผิดพลาด: ไม่พบฟังก์ชัน ... ใน R


177

นี่เป็นคำถามที่พบบ่อยดังนั้นโปรดทำให้เสร็จสมบูรณ์มากที่สุด คำตอบคือคำตอบของชุมชนดังนั้นอย่าลังเลที่จะแก้ไขหากคุณคิดว่ามีบางอย่างขาดหายไป

คำถามนี้ถูกพูดคุยและอนุมัติในเมตาดาต้า

ฉันใช้ R และพยายามsome.functionแต่ฉันได้รับข้อความแสดงข้อผิดพลาด:

Error: could not find function "some.function"

คำถามนี้เกิดขึ้นอย่างสม่ำเสมอ เมื่อคุณได้รับข้อผิดพลาดประเภทนี้ใน R คุณจะแก้ไขได้อย่างไร


5
ก่อนที่คุณจะลงคะแนนเพื่อปิดคำถามนี้ก่อนอื่นให้อ่านข้อโต้แย้งนี้ในเมตา: meta.stackexchange.com/questions/101892/…
Andrie

2
หากสิ่งอื่นล้มเหลวให้ลอง grepping ซอร์สโค้ดสำหรับ base R และแพ็กเกจที่คุณติดตั้งไว้
nullglob

3
@nullglob ดูเหมือนว่าจะค่อนข้างสุดขีด :-)
Gavin Simpson

ฉันมีคำถามที่เกี่ยวข้อง: stackoverflow.com/questions/23357551/... ในกรณีนี้Rคำสั่งใด ๆล้มเหลว แต่q()! คำแนะนำจะได้รับการชื่นชมอย่างมาก!
Aleksandr Blekh

อาจจะงี่เง่า แต่ระวังอย่าตั้งชื่อเอาท์พุทของฟังก์ชั่นเป็นฟังก์ชั่นของตัวเอง [เรียนรู้จากประสบการณ์ ... ]
3507584

คำตอบ:


126

มีบางสิ่งที่คุณควรตรวจสอบ:

  1. คุณเขียนชื่อฟังก์ชั่นของคุณถูกต้องหรือไม่? ชื่อเป็นกรณี ๆ ไป
  2. คุณติดตั้งแพ็คเกจที่มีฟังก์ชั่นหรือไม่? install.packages("thePackage")(ต้องทำเพียงครั้งเดียวเท่านั้น)
  3. คุณแนบแพ็คเกจนั้นเข้ากับพื้นที่ทำงานหรือไม่? require(thePackage)หรือlibrary(thePackage)(ควรทำทุกครั้งที่คุณเริ่มเซสชัน R ใหม่)
  4. คุณใช้เวอร์ชั่น R ที่เก่ากว่าซึ่งยังไม่มีฟังก์ชั่นนี้หรือไม่?

หากคุณไม่แน่ใจในแพ็คเกจที่ฟังก์ชั่นตั้งอยู่คุณสามารถทำบางสิ่งได้

  1. หากคุณแน่ใจว่าคุณติดตั้งและแนบ / โหลดแพ็คเกจที่ถูกต้องให้พิมพ์help.search("some.function")หรือ??some.functionรับกล่องข้อมูลที่สามารถบอกคุณได้ว่าบรรจุอยู่ในแพคเกจใด
  2. findและgetAnywhereยังสามารถใช้เพื่อค้นหาฟังก์ชั่น
  3. หากคุณไม่มีเงื่อนงำเกี่ยวกับแพ็คเกจคุณสามารถใช้findFnในsosแพ็คเกจตามที่อธิบายไว้ในคำตอบนี้
  4. RSiteSearch("some.function")หรือค้นหาด้วยrdocumentationหรือrseekเป็นวิธีทางเลือกในการค้นหาฟังก์ชัน

บางครั้งคุณต้องใช้ R รุ่นเก่ากว่า แต่เรียกใช้รหัสที่สร้างขึ้นสำหรับรุ่นที่ใหม่กว่า ฟังก์ชั่นที่เพิ่มเข้ามาใหม่ (เช่น hasName ใน R 3.4.0) จะไม่ถูกค้นพบ หากคุณใช้รุ่น R ที่เก่ากว่าและต้องการใช้ฟังก์ชันที่ใหม่กว่าคุณสามารถใช้แพคเกจแบ็คแพคเพื่อให้ฟังก์ชันดังกล่าวพร้อมใช้งาน นอกจากนี้คุณยังพบรายชื่อของฟังก์ชั่นที่จำเป็นต้องได้รับ backported ในrepo คอมไพล์ของ backports โปรดทราบว่ารุ่น R ที่เก่ากว่า R3.0.0 ไม่สามารถใช้ร่วมกับแพ็คเกจที่สร้างขึ้นสำหรับ R3.0.0 และรุ่นที่ใหม่กว่า


สวัสดี Joris ฉันมีคำถามอย่างรวดเร็ว ฉันใหม่ใน R แต่ฉันสามารถติดตั้งได้สำเร็จ ฉันต้องการใช้ฟังก์ชั่น "cosvol" ในแพ็คเกจ "ท้องฟ้า" จากบรรทัดคำสั่ง ซึ่งแตกต่างจาก R ของฉันซึ่งติดตั้งจากที่เก็บของ Fedora ลงในระบบ Linux ของฉันฉันได้ดาวน์โหลดแพ็คเกจ "ท้องฟ้า" ในไดเรกทอรีอื่นใน "บ้าน" ของฉัน ทุกครั้งที่ฉันขอฟังก์ชั่น "cosvol ()" มันบอกว่า "ไม่สามารถหาฟังก์ชั่น" cosdistCoVol "ได้ ฉันไม่แน่ใจว่าจะให้ R รู้เกี่ยวกับผู้กำกับของฉันได้อย่างไรซึ่งฟังก์ชั่นทั้งหมดจะถูกดาวน์โหลดในแพ็คเกจ "ท้องฟ้า" ของฉันต่างหาก ความช่วยเหลือของคุณได้รับการชื่นชม
Benjamin

หากฟังก์ชั่นอยู่ในหนึ่งใน core / base R libraries คุณอาจจำเป็นต้องอัพเดตมัน ในกรณีของผมผมพยายามที่จะใช้ฟังก์ชั่นในhasName utilsอย่างไรก็ตามฉันใช้ 3.3.1 และhasNameยังไม่ได้แนะนำจนกระทั่ง 3.4.0 เนื่องจากคุณไม่สามารถอัปเดตutilsเป็นห้องสมุดแบบสแตนด์อโลน R / R Studio บอกว่าฉันไม่มีห้องสมุดที่จะอัปเดต
mpag

@mpag นั่นเป็นเพราะแพ็คเกจ utils เป็นส่วนสำคัญของการเปิดตัว R หากคุณต้องการใช้ RSiteSearch ("HasName") แท้จริงรายการแรกเป็นการอ้างอิงถึงแพคเกจ backports ที่จะทำให้ฟังก์ชั่นนั้นพร้อมใช้งานใน R 3.3.1 ดูเพิ่มเติมที่github.com/r-lib/backportsสำหรับข้อมูลเพิ่มเติม ฉันได้เพิ่มข้อมูลบางอย่างสำหรับกรณีนั้นขอบคุณที่แจ้ง
Joris Meys

@JorisMeys มีประโยชน์มาก ฉันต้องการส่งว่าควรใช้มาตรฐานในการบันทึกเอกสารเมื่อมีการเพิ่มฟังก์ชั่นใน R บนหน้าความช่วยเหลือของฟังก์ชันนั้น (เช่น? hasName) เช่นค่าhttps://www.rdocumentation.org/packages/utils/versions/3.4.3/topics/hasNameมิได้https://stat.ethz.ch/R-manual/R-devel/library/utils/html/hasName.htmlพูดว่า "นำมาใช้ในการวิจัย 3.4.0" ผมจบลงด้วยการหามันออกมาโดยการเรียกดูผ่าน Repos GitHub และดูที่blameสำหรับ utils / R / hasName.R และฐาน / R / match.R
mpag

@mpag หรือคุณสามารถเปิดอ่านอย่างแรกในแบบอักษรRSiteSearch("hasName")และได้รับข้อมูลเดียวกัน นั่นเป็นเหตุผลที่ฉันเพิ่มเมื่อหลายปีก่อนในคำตอบนั้น มันเป็นเคล็ดลับที่มีประโยชน์ที่จะรู้ ;-)
Joris Meys

29

ปัญหาอีกประการหนึ่งในการปรากฏตัวของ NAMESPACE ที่เป็นว่าคุณกำลังพยายามที่จะใช้ฟังก์ชั่นแพคเกจจาก unexported foo

ตัวอย่างเช่น (วางแผนฉันรู้ แต่):

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

ประการแรกคุณไม่ควรจะเรียกวิธี S3 โดยตรง แต่ให้ถือว่าplot.prcompเป็นจริงบางฟังก์ชั่นภายในที่มีประโยชน์ในแพคเกจfoo :::การเรียกใช้ฟังก์ชันเช่นถ้าคุณรู้ว่าสิ่งที่คุณทำต้องใช้ คุณต้องทราบ namespace ที่พบฟังก์ชั่น ใช้getAnywhere()เราพบว่าฟังก์ชั่นอยู่ในสถิติแพคเกจ:

> 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>

ดังนั้นตอนนี้เราสามารถเรียกมันได้โดยตรงโดยใช้:

> stats:::plot.prcomp(mod)

ฉันใช้plot.prcompเป็นตัวอย่างเพื่ออธิบายวัตถุประสงค์ ในการใช้งานปกติคุณไม่ควรเรียกวิธีการ S3 เช่นนี้ แต่อย่างที่ฉันบอกถ้าฟังก์ชั่นที่คุณต้องการโทรหาอยู่ (อาจเป็นฟังก์ชั่นยูทิลิตี้ที่ซ่อนอยู่) แต่อยู่ใน a namespace, R จะรายงานว่ามันไม่สามารถหาฟังก์ชั่นได้ .

เปรียบเทียบสิ่งต่อไปนี้: ข้อผิดพลาดstats::plot.prcomp ด้านบนล้มเหลวเนื่องจากในขณะที่statsใช้plot.prcompมันจะไม่ถูกส่งออกจากstatsเนื่องจากข้อผิดพลาดบอกเราอย่างถูกต้อง:

ข้อผิดพลาด: 'plot.prcomp' ไม่ใช่วัตถุที่ส่งออกจาก 'namespace: stats'

เอกสารนี้มีดังต่อไปนี้:

pkg :: name ส่งคืนค่าของชื่อตัวแปรที่เอ็กซ์พอร์ตในเนมสเปซ pkg ในขณะที่ pkg ::: name ส่งคืนค่าของชื่อตัวแปรภายใน


1
ขอบคุณ - สิ่งนี้ช่วยฉันหลังจากอัปเกรดเป็น R 3 สำหรับcould not find function "anova.lm"... แก้ไขด้วยการโทรstats:::anova.lm()แทน
ErichBSchulz

แม้ว่าจะไม่เกี่ยวข้องกัน แต่การใช้งาน:::ถูกอ้างถึงว่าเป็นความผิดพลาดในการออกแบบและ::เป็นที่ต้องการ ไม่สามารถหาข้อมูลอ้างอิงได้อย่างง่ายดาย
NelsonGon

1
@NelsonGon ด้วยความเคารพจากทุกคน::และ:::มีความแตกต่างกันและแก้ไขของคุณไม่ทำงาน ! plot.prcomp()ฟังก์ชั่นไม่ได้ส่งออกจากสถิติ namespace :::ดังนั้นคุณจำเป็นต้องใช้
Gavin Simpson

@GavinSimpson ถูกต้อง! ฉันใช้คำของ R dev ที่เคารพสำหรับข้อผิดพลาดในการออกแบบและไม่เคยตรวจสอบเลย บางทีมันเป็นความเห็นส่วนตัวของพวกเขา
NelsonGon

11

ฉันมักจะสามารถแก้ไขปัญหานี้เมื่อคอมพิวเตอร์อยู่ภายใต้การควบคุมของฉัน แต่มันเป็นเรื่องน่ารำคาญเมื่อทำงานกับกริด เมื่อกริดไม่เหมือนกันอาจมีการติดตั้งไลบรารี่บางส่วนและประสบการณ์ของฉันมักจะเป็นเพราะแพ็กเกจไม่ได้ติดตั้งเนื่องจากไม่ได้ติดตั้งการพึ่งพา ในการแก้ไขปัญหานี้ฉันจะตรวจสอบสิ่งต่อไปนี้:

  1. ติดตั้ง Fortran หรือไม่ (มองหา 'gfortran') สิ่งนี้มีผลกับแพ็คเกจที่สำคัญหลายรายการใน R
  2. ติดตั้ง Java หรือไม่ เส้นทางคลาส Java ถูกต้องหรือไม่
  3. ตรวจสอบว่าแพ็คเกจถูกติดตั้งโดยผู้ดูแลระบบและพร้อมใช้งานโดยผู้ใช้ที่เหมาะสม บางครั้งผู้ใช้จะติดตั้งแพคเกจในตำแหน่งที่ไม่ถูกต้องหรือรันโดยไม่ต้องเข้าถึงไลบรารีที่เหมาะสม .libPaths()เป็นการตรวจสอบที่ดี
  4. ตรวจสอบlddผลลัพธ์สำหรับ R เพื่อให้แน่ใจเกี่ยวกับไลบรารีที่แชร์
  5. เป็นการดีที่จะเรียกใช้สคริปต์เป็นระยะซึ่งโหลดทุกแพ็คเกจที่จำเป็นและทำการทดสอบเล็กน้อย สิ่งนี้จะจับปัญหาของแพคเกจให้เร็วที่สุดในเวิร์กโฟลว์ นี่คล้ายกับการสร้างการทดสอบหรือการทดสอบหน่วยยกเว้นการทดสอบควันเพื่อให้แน่ใจว่าสิ่งพื้นฐานใช้งานได้
  6. หากแพ็คเกจสามารถเก็บไว้ในตำแหน่งที่เข้าถึงเครือข่ายได้ หากไม่สามารถทำได้มีวิธีการตรวจสอบเวอร์ชั่นที่สอดคล้องกันในเครื่องหรือไม่? (อาจดูเหมือน OT แต่การติดตั้งแพคเกจที่ถูกต้องรวมถึงความพร้อมใช้งานของรุ่นที่เหมาะสม )
  7. มีแพ็คเกจสำหรับระบบปฏิบัติการที่ให้มาหรือไม่ น่าเสียดายที่บางแพ็คเกจนั้นไม่มีให้บริการในทุกแพลตฟอร์ม สิ่งนี้จะกลับไปที่ขั้นตอนที่ 5 หากเป็นไปได้พยายามหาวิธีจัดการกับระบบปฏิบัติการอื่นโดยสลับไปใช้รสชาติที่เหมาะสมของแพ็คเกจหรือปิดการพึ่งพาในบางกรณี

เมื่อเจอสิ่งนี้มาสักระยะบางขั้นตอนเหล่านี้ก็กลายเป็นกิจวัตรอย่างเป็นธรรม แม้ว่า # 7 อาจดูเหมือนเป็นจุดเริ่มต้นที่ดี แต่สิ่งเหล่านี้จะปรากฏตามลำดับความถี่โดยประมาณที่ฉันใช้


2
ข้อควรพิจารณาที่มีประโยชน์เพื่อให้แน่ใจ แต่มีคำตอบเพิ่มเติมสำหรับ "ทำไมฉันจึงได้รับข้อผิดพลาดเมื่อติดตั้งแพคเกจ"
IRTFM

@DWin: อาจจะ แต่ไม่จริง ฉันอาจไม่ชัดเจน ปัญหาเหล่านี้เกิดขึ้นเมื่องานหยุดทำงานบนตะแกรงเนื่องจากแพ็คเกจไม่ได้ถูกติดตั้ง การบำรุงรักษาความสอดคล้องของซอฟต์แวร์บนกริดนั้นไม่ยาก แต่ต้องมีกระบวนการที่ดีสำหรับการติดตั้งการบำรุงรักษาและการดีบัก เหล่านี้เป็นเพียงบางส่วนของรายการที่มาจากแต่ละขั้นตอนอย่างน้อยที่สุดก็เกี่ยวข้องกับเสียง screaching ที่เกิดขึ้นเมื่อไม่มีฟังก์ชั่น :)
Iterator

6

หากสิ่งนี้เกิดขึ้นขณะที่คุณตรวจสอบแพ็กเกจของคุณ (ตรวจสอบ R CMD) ให้ดูที่ NAMESPACE ของคุณ

คุณสามารถแก้ไขได้โดยเพิ่มคำสั่งต่อไปนี้ใน NAMESPACE:

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

สิ่งนี้จะส่งออกทุกสิ่งที่ไม่ได้ขึ้นต้นด้วยจุด (".") สิ่งนี้ช่วยให้คุณมีฟังก์ชั่นที่ซ่อนอยู่เริ่มต้นด้วยจุด:

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

สิ่งนี้ล้มเหลวสำหรับฉันใน RStudio - ข้อผิดพลาด: '\.' เป็นการหลบหนีที่ไม่รู้จักในสตริงอักขระที่เริ่มต้น "" ^ [^ \. "
แอนดรู

1
ข้อเสนอแนะใด ๆ เกี่ยวกับสิ่งที่ฉันสามารถทำได้ถ้าฉันได้รับข้อผิดพลาดในขณะที่ใช้แพ็คเกจที่ฉันไม่ได้เขียน? แพ็คเกจดูเหมือนว่าต้องการใช้วิธีการภายในที่ไม่ได้กำหนดไว้เนื่องจากผู้เขียนไม่ได้ทำตามที่กล่าวมาข้างต้น
Andre Luus

4

ฉันมีข้อผิดพลาด

ข้อผิดพลาด: ไม่พบฟังก์ชัน some.function

เกิดขึ้นเมื่อทำการตรวจสอบ R CMD ของแพคเกจที่ฉันทำกับ RStudio ฉันพบการเพิ่ม

exportPattern ( "")

ไปยังไฟล์ NAMESPACE ไม่ได้หลอกลวง ในฐานะ sidenote ฉันได้กำหนดค่าเริ่มต้นให้ RStudio ใช้ ROxygen เพื่อจัดทำเอกสาร - และเลือกการกำหนดค่าที่ ROxygen จะเขียนไฟล์ NAMESPACE ของฉันให้ฉันซึ่งยังคงลบการแก้ไขของฉันอยู่ ดังนั้นในกรณีของฉันฉันไม่ได้ตรวจสอบ NAMESPACE จากการกำหนดค่า Roxygen และเพิ่ม exportPattern (".") ไปยัง NAMESPACE เพื่อแก้ไขข้อผิดพลาดนี้


1
คุณควรใช้ roxygen2 ดีกว่าที่จะจดจำการแก้ไขที่คุณทำกับไฟล์เนมสเปซและทำให้พวกเขาเหมือนเดิม ฉันขอแนะนำอย่างยิ่งให้ต่อต้านการใช้ exportPattern (".") ในไฟล์เนมสเปซ ใช้แท็ก @export แทนในไฟล์แต่ละไฟล์ของคุณดังนั้นคุณจะส่งออกเฉพาะฟังก์ชันที่ต้องการส่งออกเท่านั้น Roxygen2 จะอัปเดตเนมสเปซโดยอัตโนมัติเพื่อส่งออกฟังก์ชั่นทั้งหมดที่ต้องการส่งออก
Joris Meys

1
Joris - ฉันซาบซึ้งที่คุณสละเวลาเพื่อแสดงความคิดเห็น ฉันเห็นด้วย 100% กับสิ่งที่คุณเขียน ตอนนี้ฉันกำลังใช้ devtools / roxygen2 และฉันกำลังวางฟังก์ชั่นต่อไปนี้ในทุกฟังก์ชั่นที่ฉันต้องการส่งออก: # '@export
swihart

4

ข้อผิดพลาดนี้สามารถเกิดขึ้นได้แม้ว่าชื่อของฟังก์ชั่นจะถูกต้องหากมีข้อโต้แย้งที่จำเป็นบางอย่างหายไป (เช่นคุณไม่ได้ให้ข้อโต้แย้งเพียงพอ)
ฉันได้สิ่งนี้ในบริบท Rcpp ซึ่งฉันเขียนฟังก์ชัน C ++ พร้อมด้วยตัวเลือกอาร์กิวเมนต์อาร์กิวเมนต์และไม่ได้ระบุอาร์กิวเมนต์เหล่านั้นใน R ดูเหมือนว่าอาร์กิวเมนต์ตัวเลือก Optionnal จาก C ++ ถูกมองว่าเป็นข้อบังคับโดย R ดังนั้น R ไม่สามารถหาได้ ฟังก์ชันที่ตรงกันสำหรับชื่อที่ถูกต้อง แต่มีจำนวนอาร์กิวเมนต์ที่ไม่ถูกต้อง

ฟังก์ชัน Rcpp: SEXP RcppFunction(arg1, arg2=0) {}
R Calls:
RcppFunction(0)ทำให้เกิดข้อผิดพลาด
RcppFunction(0, 0)ไม่ได้


2

Rdocumentation.orgมีฟังก์ชั่นการค้นหาที่มีประโยชน์มากซึ่งเหนือสิ่งอื่นใด - ช่วยให้คุณค้นหาฟังก์ชั่น - จากแพ็คเกจทั้งหมดใน CRAN รวมถึงจากแพ็คเกจจาก Bioconductor และ GitHub

ป้อนคำอธิบายรูปภาพที่นี่


1

หากคุณกำลังใช้งานparallelMapคุณจะต้องส่งออกฟังก์ชั่นที่กำหนดเองไปยังงานทาสมิฉะนั้นคุณจะได้รับข้อผิดพลาด "ไม่พบฟังก์ชัน"

หากคุณตั้งค่าระดับที่ไม่หายไปในparallelStartอาร์กิวเมนต์เดียวกันควรส่งผ่านไปยังparallelExportมิฉะนั้นคุณจะได้รับข้อผิดพลาดเดียวกัน ดังนั้นควรปฏิบัติตามอย่างเคร่งครัด:

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

0

คุณอาจสามารถแก้ไขข้อผิดพลาดนี้ด้วยการเว้นวรรคชื่อ ::การเรียกใช้ฟังก์ชัน

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

ถึง

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

1
ข้อผิดพลาดแจ้งว่า "การเปรียบเทียบ" แทน "การเปรียบเทียบ" ฉันคิดว่า namespace ไม่ใช่ปัญหา :-)
Joris Meys

Good spot @Joris Meys
Tony Cronin

-1

ฉันได้รับเหมือนกันข้อผิดพลาดฉันใช้งานรุ่น. 99xxx ฉันตรวจสอบการอัปเดตจากเมนูช่วยเหลือและอัปเดต RStudio ของฉันเป็น 1.0x แล้วข้อผิดพลาดไม่ได้มา

ทางออกง่ายๆเพียงอัปเดต R Studio ของคุณ


1
คุณช่วยอธิบายรายละเอียดเกี่ยวกับสิ่งที่ผิดพลาดได้ไหม สิ่งนี้อาจช่วยได้ แต่ในบางกรณีเท่านั้น
Joris Meys
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.