2016-10-20 14 views
0

После одного учебника (в моем родном языке), я пытаюсь написать функцию decorate_string, которая будет в состоянии сделать это:Передача аргументов вложенных функций с эллипсов на языке R

decorate_string(pattern = "123", "abc")   # "123abc321" 
decorate_string(pattern = "123", "abc", "def")  # "123abc def321" 
decorate_string(pattern = "123", c("abc", "def")) # "123abc321" "123def321" 
decorate_string(pattern = "123", "abc", "def", sep = "+") # "123abc+def321" 
decorate_string(pattern = "!", c("x", "x"), collapse = "_") # "!x_x!" 
decorate_string(pattern = ".:", 1:2, 3:4, 5:6, sep = "&") # ".:1&3&5:." ".:2&4&6:." (вектор длины 2) 

БЫТЬ SHORT: он разрушает строки с помощью сепарера и разделяет его с рисунком слева и обратным рисунком справа.

Я сделал это:

decorate_string <- function(pattern, ...) { 
    fock <- function(x, pattern, rev_pat){ 
    x <- paste(pattern, x, rev_pat, collapse = "") 
    return(x) 
    } 
    rev_pat <- paste(rev((strsplit(pattern,NULL))[[1]]), collapse = "") 
    #a <- paste0(..., sep=" ") 
    a <- sapply(paste(..., sep=" "), fock) 
    return(a) 
} 

Но он говорит мне, что аргумент sep соответствует severel аргументы. Я думаю, он пытается передать аргумент sep во вложенной функции тоже, верно? Но вложенная функция не запрашивает этот аргумент! Я НЕ хочу, чтобы функция fock получала мой параметр. Я хочу только sapply, чтобы получить этот параметр !! Что я должен делать? Спасибо

+0

Добавить sep как параметр в вашей функции. Таким образом, он не включен в список точек. – Dason

+0

@Dason Извините, это было мое плохо! Я НЕ хочу, чтобы вложенная функция получала этот параметр! Я хочу, чтобы 'sep' использовался один раз в' sapply'! –

+0

Нет, проблема заключается в том, что если у вас нет параметра sep в качестве параметра, он передается в список точек. Поэтому, когда вы используете пасту (..., sep = "), это похоже на то, что вы говорите' paste (что-то, sep = ",", sep = "") ', поэтому вы получаете ошибку, потому что R например «зависание», вы не можете дважды использовать параметр sep ». Но если вы определите его как параметр в исходной функции, то он не будет включен в список точек. – Dason

ответ

0

Как @Dason предложил: « Я никогда ничего не говорил о функции fock. Это не проблема. Проблема заключается в вашей строке a <- sapply(paste(..., sep=" "), fock). В этом заявлении пасты проходит через sep точки, а затем указать другое sep. Вам нужно либо удалить sep из списка точек вручную, либо передать его другому аргументу, в котором он никогда не будет в списке точек, начиная с «