Вставить символ в каждое k-е место строки в R - PullRequest
2 голосов
/ 09 мая 2020

У меня есть квадратная матрица n x n, где n - полный квадрат. Я хотел бы вставить вертикальную линию в каждую позицию k^th, где k - это квадрат root из n, и распечатать результат, используя R.

Я могу добиться этого больше всего кстати, однако я получаю NULL в конце каждой строки.

Вот мой код

# create test matrix
set.seed(1)
temp = matrix(sample(x=(11:99), size= 81), 9, 9)

# function to place “|” in every kth position of each row
custom_print = function(x){

  s = as.integer(sqrt(nrow(x)))

  for(r in 1:nrow(x)){
      for(c in 1:s){
        current.row = cat("|", x[r, (s*(c-1)+1):(c*s)], "")
      }
    print(current.row)
  }
}

custom_print(temp)

Это приводит к следующему выводу:

> custom_print(temp)
| 34 15 37 | 99 53 85 | 13 50 62 NULL
| 43 27 92 | 64 16 12 | 14 58 32 NULL
| 60 24 75 | 31 71 97 | 66 17 18 NULL
| 89 63 25 | 39 70 41 | 57 22 67 NULL
| 28 40 54 | 45 51 38 | 52 74 33 NULL
| 86 68 19 | 69 42 29 | 23 83 90 NULL
| 96 47 95 | 21 91 98 | 81 79 80 NULL
| 65 87 35 | 56 36 93 | 46 55 20 NULL
| 61 82 11 | 84 72 76 | 94 26 44 NULL

Я не знаю причину, по которой я получаю NULL в конце каждой строки, и я не знаю, как его удалить.

Кто-нибудь, пожалуйста, дайте мне знать, где я делаю ошибка пожалуйста?

Ответы [ 2 ]

3 голосов
/ 09 мая 2020

Причина, по которой вы получаете NULL, заключается в том, что cat печатает текст и возвращает NULL

temp <- cat('x1')
#x1
temp
NULL

Вам не нужно явно print объект, cat - это уже делаю это. Попробуйте:

custom_print = function(x){

  s = as.integer(sqrt(nrow(x)))
  for(r in 1:nrow(x)){
    for(c in 1:s){
      cat("|", x[r, (s*(c-1)+1):(c*s)], "")
    }
      cat('\n')
    }
}


#| 78 31 43 | 67 98 28 | 27 86 37 
#| 49 64 45 | 33 91 32 | 23 95 29 
#| 11 84 52 | 16 79 57 | 66 22 13 
#| 44 17 48 | 72 89 99 | 26 58 76 
#| 53 83 30 | 50 34 97 | 81 74 56 
#| 24 47 38 | 73 42 60 | 51 36 20 
#| 92 85 77 | 35 94 71 | 62 88 46 
#| 69 96 68 | 65 12 63 | 75 80 59 
#| 61 54 82 | 70 55 21 | 87 19 40 
1 голос
/ 09 мая 2020

Просто для интереса, это можно сделать без использования циклов и сделать обобщение для любой матрицы nxn, где n - полный квадрат. Вместо этого он использует модульную математику и арифметику индексации c:

print_square <- function(mat)
{
  k <- length(mat)^(1/4)
  m <- matrix("|", k^2, k*(k+1))
  m[seq_along(mat) + ((seq_along(mat) - 1) %/% k^3) * k^2] <- mat
  m[length(m) - (k^2 - 1):0] <- "\n"
  cat("", t(m))
}

Так, например:

print_square(temp)
#>  78 31 43 | 67 98 28 | 27 86 37 
#>  49 64 45 | 33 91 32 | 23 95 29 
#>  11 84 52 | 16 79 57 | 66 22 13 
#>  44 17 48 | 72 89 99 | 26 58 76 
#>  53 83 30 | 50 34 97 | 81 74 56 
#>  24 47 38 | 73 42 60 | 51 36 20 
#>  92 85 77 | 35 94 71 | 62 88 46 
#>  69 96 68 | 65 12 63 | 75 80 59 
#>  61 54 82 | 70 55 21 | 87 19 40 

или

print_square(matrix(sample(256) + 100, 16, 16))
#>  263 151 178 305 | 156 293 177 252 | 210 352 136 274 | 173 244 235 226 
#>  248 219 171 162 | 337 108 259 110 | 256 155 285 109 | 113 334 346 251 
#>  250 309 228 217 | 257 183 339 288 | 260 180 152 224 | 181 345 119 290 
#>  221 329 159 145 | 102 147 130 106 | 103 327 165 348 | 170 194 312 124 
#>  269 340 319 268 | 229 192 126 287 | 242 188 298 131 | 167 137 294 203 
#>  186 225 190 166 | 160 212 209 230 | 325 350 213 172 | 295 176 333 281 
#>  311 280 258 141 | 169 336 107 200 | 198 335 175 246 | 279 114 286 163 
#>  208 189 158 353 | 317 146 271 347 | 277 320 354 182 | 211 341 297 112 
#>  118 301 115 236 | 140 239 127 296 | 270 187 111 220 | 261 207 116 307 
#>  144 249 214 125 | 241 275 143 343 | 245 238 276 282 | 302 123 318 195 
#>  267 121 164 355 | 299 314 237 265 | 216 149 148 289 | 128 303 196 168 
#>  129 179 234 222 | 232 184 300 272 | 231 122 157 139 | 310 356 153 254 
#>  191 215 134 105 | 142 328 351 199 | 266 304 204 342 | 161 150 278 193 
#>  264 201 330 174 | 223 240 308 104 | 227 206 154 284 | 291 344 247 218 
#>  132 292 101 120 | 233 315 313 273 | 185 326 349 321 | 202 338 197 255 
#>  323 316 117 283 | 138 324 253 322 | 262 306 205 135 | 331 133 332 243
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...