Eu descobri que as declarações ifelse de R são muito úteis de vez em quando. Por exemplo:
ifelse(TRUE,1,2)
# [1] 1
ifelse(FALSE,1,2)
# [1] 2
Mas estou um tanto confuso com o seguinte comportamento.
ifelse(TRUE,c(1,2),c(3,4))
# [1] 1
ifelse(FALSE,c(1,2),c(3,4))
# [1] 3
Esta é uma escolha de design que está acima do meu salário?
r
if-statement
r-faq
Christopher DuBois
fonte
fonte
Respostas:
A documentação para os
ifelse
estados:Como você está passando nos valores de teste de comprimento 1, está obtendo resultados de comprimento 1. Se você passar em vetores de teste mais longos, obterá resultados mais longos:
Assim,
ifelse
destina-se ao propósito específico de testar um vetor de booleanos e retornar um vetor de mesmo comprimento, preenchido com elementos retirados do (vetor)yes
eno
argumentos.É uma confusão comum, por causa do nome da função, usá-la quando na verdade você quer apenas uma
if () {} else {}
construção normal .fonte
if (TRUE) c(1,2) else c(3,4)
.Aposto que você quer uma
if
declaração simples em vez deifelse
- em R,if
não é apenas uma estrutura de fluxo de controle, ela pode retornar um valor:fonte
" Warning in if (req(inputval) == "All") { : the condition has length > 1 and only the first element will be used"
o que devo fazer para me livrar desse aviso?req(inputval)
tem mais elementos. Para obter um único valor, as funçõesany()
ouall()
podem ser úteis.Observe que você pode contornar o problema se atribuir o resultado dentro de
ifelse
:fonte
ifelse()
função vetorizada no lugar de um fluxo de controleif ... else ...
para atribuição. Se a condição for um único valorTRUE
ouFALSE
, prefiro escrevera <- if (TRUE) c(1,2) else c(3,4)
ouif (TRUE) a <- c(1,2) else a <- c(3,4)
ifelse
vez deif
...else
no caso de uma única condição pode realmente ser um problema eifelse
pode ser preferida em alguns casos dentro do código (suponho simples aqui), não posso discordar de você ;-). Eu só queria mostrar um jeito comifelse
.sim, acho que ifelse () é realmente projetado para quando você tem um grande vetor de testes e deseja mapear cada um para uma de duas opções. Por exemplo, costumo fazer cores para plot () desta forma:
Se você tivesse um grande e longo vetor de testes, mas desejasse pares de saídas, poderia usar
sapply()
ouplyr
'sllply()
ou algo assim, talvez.fonte
Às vezes, o usuário só precisa de uma
switch
declaração em vez de umifelse
. Nesse caso:(que é outra opção de sintaxe da resposta de Ken Williams)
fonte
Aqui está uma abordagem semelhante à sugerida por Cath, mas pode funcionar com vetores pré-atribuídos existentes
Baseia-se em usar o seguinte
get()
:fonte
use `if`, por exemplo
fonte
No seu caso, usar
if_else
dedplyr
teria sido útil:if_else
é mais restrito do queifelse
e gera um erro para o seu caso:fonte
Encontrado em everydropr :
Pode replicar o resultado da sua condição para retornar o comprimento desejado
fonte