Удалите лишние пробелы с помощью `gsub` для `print.xtable`

Я новичок в разработке R, и мне нужно изменить некоторый существующий код. В частности, мне нужно изменить вызов print(), чтобы он удалял лишние последовательные пробелы.

Я нашел параметр sanitize.text.function и успешно передал его своей пользовательской функции функции print(). И он делает то, что мне нужно. Этот код выглядит следующим образом:

print(xtable(x,...),type="html",
      sanitize.text.function = function(s) gsub(" {2,}", "", s),...)

Теперь я пытаюсь извлечь код "анонимной"/"встроенной" функции в именованную функцию, например...

clean <- function(s) { gsub(" {2,}", "", s) }
print(xtable(x,...),type="html",sanitize.text.function = clean(s),...)

Однако, когда я выполняю это, я получаю следующее:

Ошибка в gsub(" {2,}", "", s): объект не найден

Желание определить функцию имеет два аспекта:

  1. для создания повторно используемого блока кода, на который можно было бы ссылаться в других местах, и
  2. возможность добавить больше gsub() или подобных исполнений, которые могут понадобиться,

Например,

clean <- function(s) { 
    gsub(" {2,}", "", s)
    gsub(">(.*?:)", "<span style=float:left>\1</span>", s)
}

print(xtable(x,...),type="html",sanitize.text.function = clean(s),...)

person d60402    schedule 23.12.2011    source источник
comment
вы пробовали с sanitize.text.function = clean? Вам не нужно указывать (s), так как это аргумент функции. R будет искать объект s и не найдет его. sanitize.text.function принимает функцию в качестве аргумента, поэтому имени clean должно быть достаточно.   -  person Joris Meys    schedule 24.12.2011
comment
Кроме того, если вы не находитесь внутри функции... нет смысла использовать ее в качестве параметра.   -  person Dason    schedule 24.12.2011
comment
Если вы хотите выполнить оба блока кода, вы должны изменить первую строку на s ‹-gsub({2,},,s).   -  person Wojciech Sobala    schedule 24.12.2011
comment
Обычно я использую trim из package:gdata для удаления начальных и конечных пробелов.   -  person IRTFM    schedule 24.12.2011


Ответы (1)


sanitize.text.function ожидает функцию, но вы передаете результат clean(s) вместо функции (аргумент будет оцениваться!). Таким образом, вы можете либо использовать sanitize.text.function=clean, либо, если вам нужно переназначить аргументы sanitize.text.function=function(x) clean(x), которая представляет собой конструкцию лямбда (безымянной) функции, которую вы искали (последнее, очевидно, имеет смысл только для чего-то более сложного).

person Simon Urbanek    schedule 24.12.2011