вставка нескольких элементов списка для создания строки из одного символа - PullRequest
0 голосов
/ 15 июня 2019

В настоящее время у меня есть неуклюжее решение, которое позволяет склеивать фрагменты текста и элементы списка в одну строку. Некоторые пробелы необходимы, чтобы остаться, а другие должны быть удалены.

Мой код в настоящее время дает желаемый результат:

"Текст 1 имеет пробелы (x + 60) (x + 60) - (y + 30) (y + 30) - (z-20) * (z-20) Text2 имеет пробелы a1Text3"

Но в остальном это не так красноречиво, и мне было интересно, есть ли лучшие способы достижения того же результата?

x <- seq(-60,60, length.out = 5)
y <- seq(-30,10, length.out = 5)
z <- seq(20,60, length.out = 5)

area <- c("a1","a2","a3","a4", "a5")

newlist <- list(x,y,z,area)

Text1 <- "Text 1 has spaces"
Text2 <- "Text2 has spaces"
Text3 <- "Text3"

formula <- paste("(x-", newlist[[1]],")*","(x-", newlist[[1]],")", "-",
                 "(y-", newlist[[2]],")*","(y-", newlist[[2]],")","-",
                 "(z-", newlist[[3]],")*","(z-", newlist[[3]],")")

formula <- gsub(" ", "", formula)
formula <- gsub("--", "+", formula)

newname <- paste(newlist[[4]],Text3)
newname <- gsub(" ", "", newname) 

result <- paste(Text1,formula,Text2,newname)
result
[1] "Text 1 has spaces (x+60)*(x+60)-(y+30)*(y+30)-(z-20)*(z-20) Text2 has spaces a1Text3"

[2] "Text 1 has spaces (x+30)*(x+30)-(y+20)*(y+20)-(z-30)*(z-30) Text2 has spaces a2Text3"

[3] "Text 1 has spaces (x-0)*(x-0)-(y+10)*(y+10)-(z-40)*(z-40) Text2 has spaces a3Text3"  

[4] "Text 1 has spaces (x-30)*(x-30)-(y-0)*(y-0)-(z-50)*(z-50) Text2 has spaces a4Text3"  

[5] "Text 1 has spaces (x-60)*(x-60)-(y-10)*(y-10)-(z-60)*(z-60) Text2 has spaces a5Text3"

1 Ответ

0 голосов
/ 15 июня 2019

Вы можете удалить несколько строк, поместив все в paste0, а затем gsub один раз:

lis <- list(x = seq(-60,60, length.out = 5),
            y = seq(-30,10, length.out = 5),
            z = seq(20,60, length.out = 5),
            area = c("a1","a2","a3","a4", "a5"))

result <- paste0("Text1 has spaces (x-", lis[[1]], ")*(x-", lis[[1]],
                 ")-(y-", lis[[2]], ")*", "(y-", lis[[2]], ")-(z-", lis[[3]], 
                 ")*(z-", lis[[3]], ") Text2 has spaces ", lis[[4]], "Text3"
              )
result <- gsub("--", "+", result)

#### OUTPUT ####

[1] "Text1 has spaces (x+60)*(x+60)-(y+30)*(y+30)-(z-20)*(z-20) Text2 has spaces a1Text3"
[2] "Text1 has spaces (x+30)*(x+30)-(y+20)*(y+20)-(z-30)*(z-30) Text2 has spaces a2Text3"
[3] "Text1 has spaces (x-0)*(x-0)-(y+10)*(y+10)-(z-40)*(z-40) Text2 has spaces a3Text3"  
[4] "Text1 has spaces (x-30)*(x-30)-(y-0)*(y-0)-(z-50)*(z-50) Text2 has spaces a4Text3"  
[5] "Text1 has spaces (x-60)*(x-60)-(y-10)*(y-10)-(z-60)*(z-60) Text2 has spaces a5Text3"

Кроме того, вы также можете поиграть с пакетом glue:

library(glue)

result <- glue("Text1 has spaces (x-{lis[[1]]})*(x-{lis[[1]]})-(y-{lis[[2]]})*",
               "(y-{lis[[2]]})-(z-{lis[[3]]})*(z-{lis[[3]]}) Text2 has spaces ",
               "{lis[[4]]}Text3",
              )
result <- gsub("--", "+", result)

#### OUTPUT ####

Text1 has spaces (x+60)*(x+60)-(y+30)*(y+30)-(z-20)*(z-20) Text2 has spaces a1Text3
Text1 has spaces (x+30)*(x+30)-(y+20)*(y+20)-(z-30)*(z-30) Text2 has spaces a2Text3
Text1 has spaces (x-0)*(x-0)-(y+10)*(y+10)-(z-40)*(z-40) Text2 has spaces a3Text3
Text1 has spaces (x-30)*(x-30)-(y-0)*(y-0)-(z-50)*(z-50) Text2 has spaces a4Text3
Text1 has spaces (x-60)*(x-60)-(y-10)*(y-10)-(z-60)*(z-60) Text2 has spaces a5Text3

Просто помните, что возвращается "склеенный" объект. Вы можете превратить его в тип «персонаж», используя unclass или as.character.

...