Câu trả lời
Thở dài, tôi mất 45 phút để tìm câu trả lời cho câu hỏi đơn giản này. Câu trả lời là:grepl(needle, haystack, fixed=TRUE)
# Correct
> grepl("1+2", "1+2", fixed=TRUE)
[1] TRUE
> grepl("1+2", "123+456", fixed=TRUE)
[1] FALSE
# Incorrect
> grepl("1+2", "1+2")
[1] FALSE
> grepl("1+2", "123+456")
[1] TRUE
Diễn dịch
grep
được đặt tên theo tệp thực thi linux, bản thân nó là từ viết tắt của " G lobal R egular E xpression P rint", nó sẽ đọc các dòng đầu vào và sau đó in chúng nếu chúng khớp với các đối số bạn đưa ra. "Toàn cầu" có nghĩa là trận đấu có thể xảy ra ở bất kỳ đâu trên dòng đầu vào, tôi sẽ giải thích "Biểu thức chính quy" bên dưới, nhưng ý tưởng là cách thông minh hơn để khớp chuỗi (R gọi đây là "ký tự", ví dụ class("abc")
) và "In "Bởi vì đó là một chương trình dòng lệnh, phát ra đầu ra có nghĩa là nó in ra chuỗi đầu ra của nó.
Bây giờ, grep
chương trình về cơ bản là một bộ lọc, từ dòng đầu vào, đến dòng đầu ra. Và có vẻ như grep
chức năng của R tương tự sẽ có một loạt các đầu vào. Vì những lý do mà tôi hoàn toàn không biết (tôi chỉ bắt đầu chơi với R khoảng một giờ trước), nó trả về một vectơ chỉ mục khớp, thay vì danh sách các trận đấu.
Nhưng, trở lại câu hỏi ban đầu của bạn, điều chúng tôi thực sự muốn là liệu chúng tôi có tìm thấy kim trong đống cỏ khô hay không, một giá trị đúng / sai. Họ rõ ràng đã quyết định đặt tên hàm này grepl
, như trong "grep" nhưng với giá trị trả về " L ogical" (họ gọi các giá trị logic đúng và sai, ví dụ class(TRUE)
).
Vì vậy, bây giờ chúng ta biết tên đến từ đâu và nó phải làm gì. Hãy quay trở lại Biểu thức thông thường. Các đối số, mặc dù chúng là các chuỗi, chúng được sử dụng để xây dựng các biểu thức chính quy (từ đó: regex). Một regex là một cách để khớp với một chuỗi (nếu định nghĩa này làm bạn khó chịu, hãy để nó đi). Ví dụ: regex a
khớp với nhân vật "a"
, regex a*
khớp với nhân vật "a"
0 lần trở lên và regex a+
sẽ khớp với nhân vật "a"
1 lần trở lên. Do đó trong ví dụ trên, kim mà chúng ta đang tìm kiếm 1+2
, khi được coi là biểu thức chính quy, có nghĩa là "một hoặc nhiều 1 theo sau là 2" ... nhưng chúng ta được theo sau bởi một dấu cộng!
Vì vậy, nếu bạn sử dụng grepl
cài đặt không có cài đặt fixed
, kim của bạn sẽ vô tình trở thành đống cỏ khô và điều đó sẽ vô tình hoạt động khá thường xuyên, chúng ta có thể thấy nó thậm chí hoạt động cho ví dụ của OP. Nhưng đó là một lỗi tiềm ẩn! Chúng ta cần nói với nó rằng đầu vào là một chuỗi, không phải là biểu thức chính quy, rõ ràng fixed
là để làm gì . Tại sao phải sửa? Không có manh mối, đánh dấu câu trả lời này b / c có lẽ bạn sẽ phải tìm kiếm nó thêm 5 lần nữa trước khi bạn ghi nhớ nó.
Một vài suy nghĩ cuối cùng
Mã của bạn càng tốt thì càng ít lịch sử bạn phải biết để hiểu ý nghĩa của nó. Mọi đối số có thể có ít nhất hai giá trị thú vị (nếu không nó không cần phải là đối số), tài liệu liệt kê 9 đối số ở đây, có nghĩa là có ít nhất 2 ^ 9 = 512 cách để gọi nó, đó là rất nhiều công việc để viết, kiểm tra và ghi nhớ ... tách các hàm như vậy (tách chúng ra, loại bỏ các phụ thuộc lẫn nhau, các chuỗi ký tự khác với các thứ regex khác với các thứ vectơ). Một số tùy chọn cũng loại trừ lẫn nhau, không cung cấp cho người dùng cách sử dụng mã không chính xác, nghĩa là việc gọi có vấn đề phải có cấu trúc vô nghĩa (chẳng hạn như chuyển một tùy chọn không tồn tại), không phải là vô lý (nơi bạn phải phát ra một cảnh báo để giải thích nó). Nói một cách ẩn dụ: Thay thế cửa trước ở phía bên của tầng 10 bằng một bức tường tốt hơn là treo một tấm biển cảnh báo chống lại việc sử dụng nó, nhưng một trong hai tốt hơn là không. Trong một giao diện, hàm xác định các đối số sẽ trông như thế nào, chứ không phải người gọi (vì người gọi phụ thuộc vào chức năng, suy ra mọi thứ mà mọi người có thể muốn gọi nó làm cho hàm cũng phụ thuộc vào người gọi và loại này phụ thuộc theo chu kỳ sẽ nhanh chóng làm tắc nghẽn một hệ thống và không bao giờ cung cấp những lợi ích mà bạn mong đợi). Hãy cảnh giác với các loại tương đương, đó là một lỗ hổng thiết kế mà mọi thứ như suy ra mọi thứ mà mọi người có thể muốn gọi nó làm cho chức năng cũng phụ thuộc vào người gọi, và loại phụ thuộc theo chu kỳ này sẽ nhanh chóng làm tắc nghẽn hệ thống và không bao giờ cung cấp lợi ích bạn mong đợi). Hãy cảnh giác với các loại tương đương, đó là một lỗ hổng thiết kế mà mọi thứ như suy ra mọi thứ mà mọi người có thể muốn gọi nó làm cho chức năng cũng phụ thuộc vào người gọi, và loại phụ thuộc theo chu kỳ này sẽ nhanh chóng làm tắc nghẽn hệ thống và không bao giờ cung cấp lợi ích bạn mong đợi). Hãy cảnh giác với các loại tương đương, đó là một lỗ hổng thiết kế mà mọi thứ nhưTRUE
và 0
và "abc"
tất cả đều vectơ.
fixed=TRUE
, nếu không, bạn đang coi nó là biểu thức chính quy thay vì chuỗi. Xem câu trả lời của tôi từ tháng 10 năm 2016.