Lỗi: không thể tìm thấy chức năng trong R


177

Đây có nghĩa là một câu hỏi thường gặp, vì vậy hãy hoàn thành càng tốt. Câu trả lời là một câu trả lời của cộng đồng, vì vậy hãy thoải mái chỉnh sửa nếu bạn nghĩ thiếu một cái gì đó.

Câu hỏi này đã được thảo luận và phê duyệt trên meta.

Tôi đang sử dụng R và đã thử some.functionnhưng tôi nhận được thông báo lỗi sau:

Error: could not find function "some.function"

Câu hỏi này xuất hiện rất thường xuyên. Khi bạn gặp loại lỗi này trong R, làm thế nào bạn có thể giải quyết nó?


5
Trước khi bạn bỏ phiếu để đóng câu hỏi này, trước tiên hãy đọc phần thảo luận này trên meta: meta.stackexchange.com/questions/101892/
Andrie

2
Nếu vẫn thất bại, hãy thử lấy mã nguồn cho cơ sở R và các gói đã cài đặt của bạn
nullglob

3
@nullglob Điều đó có vẻ hơi cực đoan :-)
Gavin Simpson

Tôi có một câu hỏi liên quan: stackoverflow.com/questions/23357551/ . Trong trường hợp này, bất kỳ Rlệnh nào thất bại, nhưng q()! Tư vấn sẽ được đánh giá rất cao!
Alexanderr Blekh

Có thể ngớ ngẩn, nhưng hãy cẩn thận không đặt tên đầu ra của hàm là chính hàm đó. [Học theo kinh nghiệm ...]
user3507584

Câu trả lời:


126

Có một vài điều bạn nên kiểm tra:

  1. Bạn đã viết đúng tên của chức năng của bạn? Tên là trường hợp nhạy cảm.
  2. Bạn đã cài đặt gói có chứa chức năng? install.packages("thePackage")(điều này chỉ cần được thực hiện một lần)
  3. Bạn đã đính kèm gói đó vào không gian làm việc? require(thePackage)hoặc library(thePackage)(điều này nên được thực hiện mỗi khi bạn bắt đầu một phiên R mới)
  4. Bạn có đang sử dụng phiên bản R cũ hơn mà chức năng này chưa tồn tại?

Nếu bạn không chắc chắn gói chức năng đó nằm ở đâu, bạn có thể thực hiện một số điều.

  1. Nếu bạn chắc chắn rằng bạn đã cài đặt và đính kèm / tải đúng gói, hãy nhập help.search("some.function")hoặc ??some.functionđể nhận hộp thông tin có thể cho bạn biết gói đó được chứa trong gói nào.
  2. findgetAnywherecũng có thể được sử dụng để định vị các chức năng.
  3. Nếu bạn không có manh mối về gói, bạn có thể sử dụng findFntrong sosgói như được giải thích trong câu trả lời này .
  4. RSiteSearch("some.function")hoặc tìm kiếm với hàm thứ tự hoặc rseek là những cách khác để tìm hàm.

Đôi khi bạn cần sử dụng phiên bản R cũ hơn, nhưng chạy mã được tạo cho phiên bản mới hơn. Các hàm mới được thêm vào (ví dụ hasName trong R 3.4.0) sẽ không được tìm thấy sau đó. Nếu bạn sử dụng phiên bản R cũ hơn và muốn sử dụng chức năng mới hơn, bạn có thể sử dụng gói backport để cung cấp các chức năng đó. Bạn cũng tìm thấy một danh sách các chức năng cần được nhập vào trên repo git của backport . Hãy nhớ rằng các phiên bản R cũ hơn R3.0.0 không tương thích với các gói được xây dựng cho R3.0.0 và các phiên bản mới hơn.


Xin chào Joris, tôi có một câu hỏi nhanh. Tôi mới sử dụng R nhưng tôi đã có thể cài đặt thành công. Tôi muốn sử dụng chức năng "cosvol" trong gói "thiên thể" từ dòng lệnh. Không giống như R của tôi được cài đặt từ kho Fedora vào hệ thống Linux của tôi, tôi đã tải xuống gói "thiên thể" của mình trong một thư mục khác trong "nhà" của tôi. Mỗi lần tôi yêu cầu hàm "cosvol ()", nó nói, "không thể tìm thấy hàm" cosdistCoVol "." Tôi không chắc làm thế nào để R biết về giám đốc của mình, trong đó tất cả các chức năng được tải xuống trong gói "thiên thể" của tôi một cách riêng biệt. Sự giúp đỡ của bạn được đánh giá cao.
Benjamin

Nếu hàm nằm trong một trong các thư viện lõi / cơ sở R, bạn có thể cần cập nhật. Trong trường hợp của tôi, tôi đã cố gắng sử dụng hasNamechức năng trong utils. Tuy nhiên, tôi đã sử dụng 3.3.1 và hasNamekhông được giới thiệu cho đến 3.4.0. Vì bạn không thể cập nhật utilsdưới dạng thư viện độc lập, R / R Studio cho biết tôi không có bất kỳ thư viện nào để cập nhật.
mpag

@mpag Đó là vì gói utils là một phần không thể thiếu của bản phát hành R. Nếu bạn sẽ sử dụng RSiteSearch ("hasName") theo nghĩa đen, mục nhập đầu tiên là tham chiếu đến gói backports sẽ cung cấp chức năng đó trong R 3.3.1. Xem thêm github.com/r-lib/backports để biết thêm thông tin. Tôi đã thêm một số thông tin cho trường hợp đó, thx để thông báo
Joris Meys

@JorisMeys rất hữu ích. Tôi cũng muốn gửi rằng nó phải là thông lệ tiêu chuẩn để ghi lại khi một chức năng đã được thêm vào R trên trang trợ giúp của chức năng đó (ví dụ: hasName). Ví dụ, https://www.rdocumentation.org/packages/utils/versions/3.4.3/topics/hasNamecũng không https://stat.ethz.ch/R-manual/R-devel/library/utils/html/hasName.htmlnói "được giới thiệu trong R 3.4.0" Tôi cuối cùng đã tìm ra nó bằng cách duyệt qua repos github và xem các blameutils / R / hasName.R và base / R / match.R
mpag

@mpag hoặc bạn có thể đã mở nghĩa đen lần đầu tiên vào RSiteSearch("hasName")và có cùng thông tin. Đó là lý do tại sao tôi đã thêm những năm trước vào câu trả lời đó. Đó là một mẹo hữu ích để biết ;-)
Joris Meys 13/03/18

29

Một vấn đề khác, với sự hiện diện của NnamPACE, là bạn đang cố chạy một chức năng không được báo cáo từ gói foo .

Ví dụ (giả định, tôi biết, nhưng):

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

Đầu tiên, bạn không nên gọi trực tiếp các phương thức S3, nhưng giả sử plot.prcompthực sự là một số chức năng nội bộ hữu ích trong gói foo . Để gọi chức năng như vậy nếu bạn biết những gì bạn đang làm đòi hỏi phải sử dụng :::. Bạn cũng cần biết không gian tên trong đó hàm được tìm thấy. Sử dụng getAnywhere()chúng tôi thấy rằng chức năng là trong số liệu thống kê gói :

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

Vì vậy, bây giờ chúng ta có thể gọi nó trực tiếp bằng cách sử dụng:

> stats:::plot.prcomp(mod)

Tôi đã sử dụng plot.prcompnhư một ví dụ để minh họa mục đích. Trong sử dụng bình thường, bạn không nên gọi các phương thức S3 như thế này. Nhưng như tôi đã nói, nếu hàm bạn muốn gọi tồn tại (ví dụ có thể là hàm tiện ích ẩn), nhưng trong một namespace, R sẽ báo cáo rằng nó không thể tìm thấy hàm trừ khi bạn nói với nó không gian tên nào cần tìm .

So sánh điều này với các điều sau: Lỗi stats::plot.prcomp ở trên vì trong khi statssử dụng plot.prcomp, nó không được xuất từ statsvì lỗi đúng cho chúng ta biết:

Lỗi: 'plot.prcomp' không phải là một đối tượng được xuất từ ​​'không gian tên: số liệu thống kê'

Điều này được ghi lại như sau:

pkg :: name trả về giá trị của tên biến được xuất trong không gian tên pkg, trong khi pkg ::: name trả về giá trị của tên biến nội bộ.


1
cảm ơn - điều này đã cứu tôi sau khi nâng cấp lên R 3 vì could not find function "anova.lm"... đã sửa bằng cách gọi stats:::anova.lm()thay thế
ErichBSchulz

Mặc dù không liên quan, việc sử dụng :::đã được coi là một lỗi thiết kế và ::được ưu tiên. Không thể dễ dàng tìm thấy tài liệu tham khảo.
NelsonGon

1
@NelsonGon Với tất cả sự tôn trọng, :::::khác nhau và chỉnh sửa của bạn không làm việc ! Các plot.prcomp()chức năng không được xuất khẩu từ các namespace số liệu thống kê, do đó bạn cần phải sử dụng :::.
Gavin Simpson

@GavinSimpson Đúng! Tôi đã nhận một từ R dev đáng kính cho lỗi thiết kế và chưa bao giờ thực sự xác minh nó. Có lẽ, đó là ý kiến ​​cá nhân của họ.
NelsonGon

11

Tôi thường có thể giải quyết vấn đề này khi máy tính nằm dưới sự kiểm soát của tôi, nhưng nó gây nhiều phiền toái khi làm việc với lưới điện. Khi lưới không đồng nhất, không phải tất cả các thư viện đều có thể được cài đặt và kinh nghiệm của tôi thường là gói không được cài đặt vì phụ thuộc không được cài đặt. Để giải quyết vấn đề này, tôi kiểm tra như sau:

  1. Fortran đã được cài đặt chưa? (Tìm kiếm 'gfortran'.) Điều này ảnh hưởng đến một số gói chính trong R.
  2. Java đã được cài đặt chưa? Các đường dẫn lớp Java có đúng không?
  3. Kiểm tra xem gói đã được quản trị viên cài đặt và có sẵn để người dùng thích hợp sử dụng. Đôi khi người dùng sẽ cài đặt các gói ở sai vị trí hoặc chạy mà không có quyền truy cập thích hợp vào đúng thư viện. .libPaths()là một kiểm tra tốt.
  4. Kiểm tra lddkết quả cho R, để chắc chắn về các thư viện được chia sẻ
  5. Thật tốt khi định kỳ chạy một tập lệnh chỉ tải mọi gói cần thiết và thực hiện một số thử nghiệm nhỏ. Điều này nắm bắt được vấn đề gói càng sớm càng tốt trong quy trình làm việc. Đây là giống như để xây dựng thử nghiệm hoặc thử nghiệm đơn vị, ngoại trừ nó giống như thử nghiệm khói để đảm bảo rằng những thứ rất cơ bản hoạt động.
  6. Nếu các gói có thể được lưu trữ ở một vị trí có thể truy cập mạng, phải không? Nếu họ không thể, có cách nào để đảm bảo các phiên bản nhất quán trên các máy không? (Điều này có vẻ như OT, nhưng cài đặt gói chính xác bao gồm sự sẵn có của phiên bản phù hợp .)
  7. Là gói có sẵn cho hệ điều hành nhất định? Thật không may, không phải tất cả các gói đều có sẵn trên các nền tảng. Điều này quay trở lại bước 5. Nếu có thể, hãy cố gắng tìm cách xử lý một HĐH khác bằng cách chuyển sang một hương vị thích hợp của gói hoặc tắt phụ thuộc trong một số trường hợp nhất định.

Gặp phải điều này khá nhiều, một số bước này trở nên khá thường xuyên. Mặc dù # 7 có vẻ như là một điểm khởi đầu tốt, nhưng chúng được liệt kê theo thứ tự gần đúng tần suất mà tôi sử dụng chúng.


2
Những cân nhắc hữu ích để chắc chắn, nhưng nhiều câu trả lời cho "Tại sao tôi gặp lỗi khi cài đặt gói".
IRTFM

@DWin: Có thể, nhưng không thực sự. Tôi có thể đã không rõ ràng. Những vấn đề này xuất hiện khi một công việc bị đình trệ trên lưới vì một gói không được cài đặt. Duy trì tính nhất quán của phần mềm trên lưới không khó, nhưng đòi hỏi một quy trình tốt để cài đặt, bảo trì và gỡ lỗi. Đây chỉ là một số vật phẩm phát ra từ mỗi pha, ít nhất là vì chúng liên quan đến âm thanh phát ra khi một chức năng không có sẵn. :)
Lặp lại

6

Nếu điều này xảy ra trong khi bạn kiểm tra gói hàng của mình (kiểm tra R CMD), hãy xem NnamPACE của bạn.

Bạn có thể giải quyết vấn đề này bằng cách thêm câu lệnh sau vào NnamPACE:

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

Điều này xuất mọi thứ không bắt đầu bằng dấu chấm ("."). Điều này cho phép bạn có các chức năng ẩn của mình, bắt đầu bằng dấu chấm:

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

Điều này không thành công với tôi trong RStudio - Lỗi: '\.' là một lối thoát không được nhận dạng trong chuỗi ký tự bắt đầu "" ^ [^ \. "
Andrew

1
Bất kỳ đề xuất nào về những gì tôi có thể làm nếu tôi gặp lỗi trong khi sử dụng gói tôi không viết? Bản thân gói dường như muốn sử dụng một phương thức nội bộ không được xác định bởi vì có lẽ tác giả đã không làm như trên.
Andre Luus

4

Tôi đã có lỗi

Lỗi: không thể tìm thấy chức năng some.function

xảy ra khi thực hiện kiểm tra R CMD của gói tôi đang thực hiện với RStudio. Tôi tìm thấy thêm

exportPotype (".")

vào tập tin NnamPACE đã thực hiện thủ thuật này. Với tư cách là một sidenote, ban đầu tôi đã cấu hình RStudio để sử dụng ROxygen để tạo tài liệu - và chọn cấu hình trong đó ROxygen sẽ viết tệp NAMESPACE cho tôi, nó sẽ xóa các chỉnh sửa của tôi. Vì vậy, trong trường hợp của tôi, tôi đã bỏ chọn NAMESPACE từ cấu hình Roxygen và thêm exportPotype (".") Vào NAMESPACE để giải quyết lỗi này.


1
Bạn nên sử dụng roxygen2, người ta nhận ra các chỉnh sửa bạn thực hiện đối với các tệp không gian tên và giữ chúng nguyên vẹn. Tôi cũng khuyên bạn không nên sử dụng exportPotype (".") Trong tệp không gian tên. Thay vào đó, hãy sử dụng thẻ @export trong các tệp riêng lẻ của bạn, vì vậy bạn chỉ xuất các hàm cần xuất. Roxygen2 sẽ tự động cập nhật không gian tên để xuất tất cả các chức năng cần xuất.
Joris Meys

1
Joris - Tôi thực sự đánh giá cao bạn dành thời gian để bình luận; Tôi đồng ý 100% với những gì bạn viết. Tôi hiện đang sử dụng devtools / roxygen2 và đang đặt các chức năng sau trong tất cả các chức năng tôi cần xuất: # '@export
swihart

4

Lỗi này có thể xảy ra ngay cả khi tên của hàm hợp lệ nếu thiếu một số đối số bắt buộc (nghĩa là bạn không cung cấp đủ đối số).
Tôi đã nhận được điều này trong ngữ cảnh Rcpp, ở đó tôi đã viết một hàm C ++ với các đối số tùy chọn và không cung cấp các đối số đó trong R. Có vẻ như các đối số tùy chọn từ C ++ được xem là bắt buộc bởi R. Kết quả là, R không thể tìm thấy một hàm phù hợp cho tên chính xác nhưng số lượng đối số không chính xác.

Chức năng Rcpp: SEXP RcppFunction(arg1, arg2=0) {}
R Gọi:
RcppFunction(0)tăng lỗi
RcppFunction(0, 0)không


2

Rdocumentation.org có một chức năng tìm kiếm rất tiện dụng - trong số những thứ khác - cho phép bạn tìm các chức năng - từ tất cả các gói trên CRAN, cũng như từ các gói từ Bioconductor và GitHub.

nhập mô tả hình ảnh ở đây


1

Nếu bạn đang sử dụng, parallelMapbạn sẽ cần xuất các chức năng tùy chỉnh sang các công việc nô lệ, nếu không, bạn sẽ gặp lỗi "không thể tìm thấy chức năng".

Nếu bạn đặt mức không thiếu trên parallelStartcùng một đối số sẽ được chuyển sang parallelExport, nếu không, bạn sẽ gặp lỗi tương tự. Vì vậy, điều này cần được tuân thủ nghiêm ngặt:

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

0

Bạn có thể sửa lỗi này bằng cách giãn cách tên :: gọi hàm

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

đến

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

1
Lỗi nói "so sánh" thay vì "so sánh". Tôi cho rằng không gian tên không phải là vấn đề :-)
Joris Meys 26/03/18

Điểm tốt @Joris Meys
Tony Cronin

-1

Tôi cũng bị như vậy, lỗi, tôi đang chạy phiên bản .99xxx, tôi đã kiểm tra các bản cập nhật từ menu trợ giúp và cập nhật My RStudio lên 1.0x, sau đó lỗi không xảy ra

Vì vậy, giải pháp đơn giản, chỉ cần cập nhật R Studio của bạn


1
Bạn có thể vui lòng giải thích về bản chất của lỗi. Điều này có thể giúp đỡ, nhưng chỉ trong những trường hợp rất cụ thể.
Joris Meys
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.