Выведите последовательность векторного элемента, используя cat - PullRequest
0 голосов
/ 06 июля 2018

Мне нужно получить определенный оператор вывода, используя функцию cat в R. Я написал следующий код

it <-1
w <- c(1,2,3)
cat("\nUsing the eq(s)",w,"the iter is:",it,"\n",sep=",")

, что дает мне следующий результат

Using the eq(s),1,2,3,the iter is:,1,

Мне нужно получить этот вывод, если вы можете помочь, пожалуйста

Using the eq(s) 1, 2 and 3, the iter is: 1

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Чуть более обобщенно (для случаев, когда length(w) != 3):

enlist <- function(x) {
  n <- length(x)
  if (n <= 1) return(x)
  paste(toString(x[-n]), "and", x[n])
}

cat("Using the eq(s) ", enlist(w), ", the iter is: ", it, "\n", sep = "")
Using the eq(s) 1, 2 and 3, the iter is: 1
0 голосов
/ 06 июля 2018

1) обычный кот Попробуйте это так:

cat("\nUsing the eq(s) ", toString(head(w, -1))," and ", tail(w, 1), 
  ", the iter is: ", it, "\n", sep = "")

дает:

Using the eq(s) 1, 2 and 3, the iter is: 1

1a) В этом варианте используется toString, а затем последняя запятая заменяется на and. Преимущество в том, что он работает, даже если длина w равна 1.

cat("\nUsing the eq(s) ", sub("(.*),(.*)", "\\1 and \\2", toString(w)),
   ", the iter is: ", it, "\n", sep = "")

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

2) sprintf Альтернативой является использование sprintf следующим образом:

s <- sprintf("\nUsing the eq(s) %s and %d, the iter is: %d\n", 
       toString(head(w, -1)), tail(w, 1), it)
cat(s)

3) fn $ Другой подход - fn$ в gsubfn. Если кто-то предвосхищает любую функцию f с ней, как в fn$f, то в аргументах будет выполняться строковая интерполяция.

library(gsubfn)

fn$cat(
  "\nUsing the eq(s) `toString(head(w, -1))` and `tail(w, 1)`, the iter: is $it\n"
)
...