Aritmética de Vetores e Reciclagem
Parte da seção Fundamentos do Journey de R da Coddy — lição 69 de 78.
Quando você realiza operações aritméticas entre dois vetores do mesmo comprimento, o R aplica a operação elemento por elemento:
a <- c(1, 2, 3)
b <- c(10, 20, 30)
print(a + b)Saída:
[1] 11 22 33Mas o que acontece quando os vetores têm comprimentos diferentes? O R utiliza um comportamento chamado recycling (reciclagem). O vetor mais curto é repetido para corresponder ao comprimento do mais longo:
numbers <- c(1, 2, 3, 4, 5, 6)
multiplier <- c(10, 100)
print(numbers * multiplier)Saída:
[1] 10 200 30 400 50 600Aqui, multiplier foi reciclado para se tornar c(10, 100, 10, 100, 10, 100) antes da multiplicação. Isso é especialmente útil ao operar com um único valor:
prices <- c(10, 20, 30)
print(prices * 1.1)Saída:
[1] 11 22 33O valor único 1.1 é reciclado para corresponder ao comprimento de prices. Tenha cuidado quando o comprimento do vetor mais longo não for um múltiplo do mais curto, pois o R ainda realizará a operação, mas poderá produzir um aviso sobre reciclagem parcial.
Desafio
FácilVocê receberá duas linhas de entrada:
- Uma lista de números separados por vírgula representando valores base (ex:
10,20,30,40,50,60) - Uma lista de multiplicadores separados por vírgula (ex:
2,5)
Usando aritmética de vetores e reciclagem:
- Crie um vetor numérico a partir dos valores base
- Crie um vetor numérico a partir dos multiplicadores
- Multiplique os valores base pelos multiplicadores (o R reciclará o vetor mais curto)
- Imprima o resultado da multiplicação
- Adicione
100a cada elemento dos valores base originais (reciclagem de valor único) - Imprima o resultado da adição
- Subtraia o vetor de multiplicadores do vetor de valores base
- Imprima o resultado da subtração
Por exemplo, se as entradas forem:
5,10,15,20,25,30
3,7A saída deve ser:
[1] 15 70 45 140 75 210
[1] 105 110 115 120 125 130
[1] 2 3 12 13 22 23Explicação:
- Multiplicação: Os multiplicadores
c(3, 7)são reciclados parac(3, 7, 3, 7, 3, 7), resultando em5*3, 10*7, 15*3, 20*7, 25*3, 30*7 - Adição: O valor único
100é reciclado para ser somado a cada elemento - Subtração: Os multiplicadores são reciclados novamente, resultando em
5-3, 10-7, 15-3, 20-7, 25-3, 30-7
Folha de consulta
Ao realizar operações aritméticas entre vetores de comprimentos diferentes, o R utiliza a reciclagem (recycling) - o vetor mais curto é repetido para corresponder ao comprimento do vetor mais longo:
numbers <- c(1, 2, 3, 4, 5, 6)
multiplier <- c(10, 100)
print(numbers * multiplier)Saída:
[1] 10 200 30 400 50 600O vetor multiplier é reciclado para c(10, 100, 10, 100, 10, 100) antes da multiplicação.
A reciclagem de um único valor é particularmente útil:
prices <- c(10, 20, 30)
print(prices * 1.1)Saída:
[1] 11 22 33O valor 1.1 é reciclado para corresponder ao comprimento de prices.
Nota: O R pode produzir um aviso (warning) quando o comprimento do vetor mais longo não é um múltiplo do comprimento do vetor mais curto.
Experimente você mesmo
# Ler a entrada
con <- file("stdin", "r")
base_input <- suppressWarnings(readLines(con, n = 1))
multipliers_input <- suppressWarnings(readLines(con, n = 1))
close(con)
# Converter os valores separados por vírgula em vetores numéricos
base_values <- as.numeric(strsplit(base_input, ",")[[1]])
multipliers <- as.numeric(strsplit(multipliers_input, ",")[[1]])
# TODO: Escreva seu código abaixo
# 1. Multiplicar base_values por multipliers (a reciclagem ocorrerá automaticamente)
# 2. Imprimir o resultado da multiplicação
# 3. Somar 100 a cada elemento de base_values
# 4. Imprimir o resultado da soma
# 5. Subtrair multipliers de base_values
# 6. Imprimir o resultado da subtraçãoEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
4Operadores Parte 2
Operadores Lógicos (AND, OR)Operadores Lógicos Parte 2 (NOT)Recapitulação - Lógica SimplesLógica Vetorizada Parte 1Lógica Vetorizada Parte 27Calculadora de Divisão de Conta
Mensagem de Boas-vindasObtendo a Entrada do Usuário10FizzBuzz com um Toque Especial
Visão Geral do JogoA Função FizzBuzz13Vetores Avançados
Fatiamento e Indexação de VetoresIndexação LógicaAritmética de Vetores e ReciclagemO Operador %in%2Variáveis e Tipos de Dados
Tipo de Dado NuméricoTipo de Dado InteiroTipo de Dado CaractereTipo de Dado LógicoVerificando Tipos de DadosConvenções de NomenclaturaValores Ausentes: NARecapitulação - Criação de Variáveis8Laços de Repetição
Laço ForLaço WhileBreakNext (Continue)Recapitulação - FatorialGeração de Sequências (seq, :)Laços AninhadosRecapitulação - Entrada Dinâmica3Operadores Parte 1
Operadores AritméticosDivisão Inteira e MóduloOperadores de AtribuiçãoRecapitulação - Matemática SimplesOperadores de Comparação6IO Básico
Saída com PrintCat para SaídaSaída com VariáveisLendo Entrada com readline()Básico de Conversão de TiposRecapitulação - Calculadora de IdadeRecapitulação - Verdadeiro ou Falso9Funções
Declarando uma FunçãoArgumentos de FunçãoValores de RetornoRecapitulação - Função SigmaRecapitulação - Função de ValidaçãoValores de Parâmetro Padrão