Как отметил @joran в комментариях, шаблон должен выглядеть так:
patterns<-c("dog","cat","\\(fish\\)")
\\
s скажет R читать буквально скобки при поиске шаблона.
Самый простой способ добиться этого, если вы не хотите вносить изменения вручную:
patterns <- gsub("([()])","\\\\\\1", patterns)
Что приведет к:
[1] "dog" "cat" "\\(fish\\)"
Если вы не очень знакомы с регулярными выражениями, то здесь происходит то, что он ищет какой-либо один символ в квадратных скобках. Круглые квадратные скобки, которые говорят ему, чтобы сохранить то, что он находит, что соответствует содержанию. Затем первые четыре косые черты во втором аргументе говорят ему заменить найденное им двумя косыми чертами (каждые две косые черты переводятся в одну косую черту), а \\1
говорит ему добавить все, что было сохранено из первого аргумента, т.е. (
или )
.