2016-07-08 2 views
4

Рассмотрим следующий пример:Put кавычки вокруг каждого элемента вектора, и отдельные с запятой

> n <- 1:4 
> n 
[1] 1 2 3 4 

Я хотел бы преобразовать n так, что я получаю строку, которая является '1', '2', '3', '4' (который в R, покажет как "'1', '2', '3', '4'").

Это часто возникает, когда я использую sqlQuery() с переменной строкой. К сожалению, я недостаточно хорошо знаком с RegEx, чтобы выполнить эту операцию.

Ближайший я получил в это

> paste0(n, collapse = "", sep = ",") 
[1] "1,2,3,4," 

, который не ставит отдельные цитаты вокруг каждого номера и имеет лишняя запятая в конце.

+0

'sep =" ',' "' (обратите внимание на дополнительный '' '), а затем поместите другой набор' '' вокруг всей строки, которую вы получите: '" '"+ paste0 (...) + "'" ', в основном –

+0

@nrussell Не стесняйтесь публиковать это как ответ. Я был бы признателен, если бы вы могли объяснить, что означает ''% d''. Спасибо. – Clarinetist

ответ

6

Одним из вариантов является использование sprintf с paste0,

paste0(sprintf("'%d'", 1:4), collapse = ", ") 
#[1] "'1', '2', '3', '4'" 

, где %d стандартный флаг форматирования для целых чисел из семейства C функций форматирования (printf, sprintf и т.д.). Вы можете увидеть различные параметры в файле справки (?sprintf).

Я предпочитаю это другим альтернативам, потому что вызов sprintf адресует форматирование отдельных элементов, в то время как paste0(..., collapse = "<whatever>") обрабатывает объединение элементов; ваше мнение может отличаться.


Я часто использую sprintf & cat, в сочетании с paste0 и другими функциями, когда мне нужно генерировать избыточные выражения для копирования в SQL Server, или генерировать C макросы ++ и т.д. Например, кучи INSERT заявлений

cat(sprintf("INSERT INTO #tmp(x, y, z) VALUES('%s', %d, %.2f);", 
      letters[1:5], 1:5, rnorm(5)), 
    sep = "\n" 
) 
#INSERT INTO #tmp(x, y, z) VALUES('a', 1, -1.10); 
#INSERT INTO #tmp(x, y, z) VALUES('b', 2, 0.24); 
#INSERT INTO #tmp(x, y, z) VALUES('c', 3, -0.82); 
#INSERT INTO #tmp(x, y, z) VALUES('d', 4, -0.46); 
#INSERT INTO #tmp(x, y, z) VALUES('e', 5, 0.72); 
Смежные вопросы