Для l oop возвращается только последнее значение - PullRequest
1 голос
/ 17 февраля 2020

Ниже для l oop Я могу видеть все значения. Но когда я назначаю ему новый объект, возвращаемое значение является только последним (см. Последний код). Может ли кто-нибудь помочь мне здесь, пожалуйста. Разве невозможно для всех значений, отображаемых с присвоением значения?

for(i in 1:5)
+ {
+     for(j in 1:2)
+     {
+         print(i*j);
+     }
+ }

Назначенный объект.

for(i in 1:5)
+ {
+     for(j in 1:2)
+     {
+         as <- i*j
+     }
+ }

Ответы [ 3 ]

2 голосов
/ 17 февраля 2020

Вот канонический R способ сделать это:

as.vector(seq(1:2)%*%t(seq(1:5)))

[1]  1  2  2  4  3  6  4  8  5 10

Этот подход выбирает продукт точечного продукта между [1,2] и t[1,2,3,4,5]. Вместо использования явных циклов он использовал векторы для представления границ ваших двух исходных циклов. Промежуточный результат - это матрица, которую мы можем легко преобразовать в одномерный вектор в порядке столбцов или строк, в зависимости от границ циклов.

1 голос
/ 17 февраля 2020

for l oop подход

Если вы хотите добавить новые значения к as, вы можете попробовать обновить as на as <- c(as,i*j), что объединит i*j с существующим as, а результат присваивается as, т. Е.

as <- c()
for(i in 1:5)
{
     for(j in 1:2)
     {
         as <- c(as,i*j)
     }
}

outer подход

Более эффективный способ Достичь той же цели можно с помощью outer, т. е.

as <- c(t(outer(1:5,1:2)))
0 голосов
/ 17 февраля 2020

Итак, for l oop здесь очень неэффективно. Вместо этого вы должны умножить векторы. Например,

 rep(1:5, each = 2)

дает вам

[1] 1 1 2 2 3 3 4 4 5 5

, и если вы умножите это на

1:2

, более короткий вектор будет переработан, и вы получите это:

rep(1:5, each = 2) * 1:2
[1]  1  2  2  4  3  6  4  8  5 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...