Como sei que uma função ou operação em R é vetorizada?

8

Eu ainda estou aprendendo R. Existe alguma maneira automatizada de identificar se um é R operationou functioné vectorized? Para identificar se um Robjeto é a vector, eu posso usar is.vector(x), que retorna TRUEse xfor um vetor ou Falsenão. Existe algo semelhante para vectorized?

Por exemplo:

x <- c(1,2,3)
y <- c(3,4,5)
x+y
#[1] 4 6 8

Como +é vetorizado, ele automaticamente addselementos individuais de um vetor xcom elementos individuais de y. Caso contrário, eu teria que usar um forloop para obter uma saída semelhante.

for(i in seq_along(x)){
  cat(sprintf("%i ", x[i]+y[i]))
}
#4 6 8 

Minha compreensão até agora limitada do termo Vectorizedimplica a operação automática de elementos que, de outra forma, eu teria que fazer em elementos individuais de um vetor, um por um.

Existe um método você recomenda usar para identificar se um operationou um functionem Ré vectorized?

Obrigado.

Anon Mousy
fonte

Respostas:

3

A vetorização em R significa basicamente que qualquer loop é movido para uma linguagem compilada mais rápida, como C ou FORTRAN. Para que isso ocorra, o (s) vetor (es) em questão deve ser "atômico" - ou seja, "plano" e homogêneo - e o tipo de vetor, com o qual você pode verificar typeof(), deve fazer sentido para a (s) operação (ões) realizada (s). Se é atômico, então é vetorizado.

Você pode verificar se um vetor é atômico usando is.atomic(). Outro tipo de vetor que não é vetorizado é chamado de "recursivo", que você pode verificar usandois.recursive() . Objetos recursivos podem conter outros objetos de qualquer tipo, ou seja, eles podem ser heterogêneos. Listas e quadros de dados são recursivos.

Tente algo como o seguinte para obter algumas idéias sobre atômica versus recursiva:

# Atomic:
1
1:3
c("a", "b", "c")
c(T, F, T)

# Recursive:
list(nums = 1:3, letts = c("a", "b", "c"), logics = c(T, F, T))
data.frame(nums = 1:3, letts = c("a", "b", "c"), logics = c(T, F, T))

# Vectors can be atomic or recursive:
is.vector(1:9) # TRUE
is.atomic(1:9) # TRUE
is.recursive(1:9) # FALSE

is.vector(list(nums = 1:9, chars = "x")) # TRUE
is.atomic(list(1:9)) # FALSE
is.recursive(list(1:9)) # TRUE

# Matrices are atomic, data frames are recursive:
is.vector(matrix(1:9, 3)) # FALSE
is.atomic(matrix(1:9, 3)) # TRUE
is.recursive(matrix(1:9, 3)) # FALSE

is.vector(as.data.frame(matrix(1:9, 3))) # FALSE
is.atomic(as.data.frame(matrix(1:9, 3))) # FALSE
is.recursive(as.data.frame(matrix(1:9, 3))) # TRUE

Eu acho que você pode assumir que muitas, se não a maioria, das funções R que você usa com mais freqüência são vetorizadas. Eu acho que não há outra maneira de verificar isso, exceto olhando a documentação ou as funções internas. Sempre que você pensar em escrever um loop for para executar operações simples em elementos, pense em como fazê-lo usando vetorização. Com prática suficiente, isso se tornará uma segunda natureza para você. Para mais detalhes, recomendo este post de Noam Ross.

gersht
fonte
@AnonMousy feliz em ajudar. Se a resposta o ajudou, você consideraria selecioná-la como a resposta aceita clicando no botão √? Dessa forma, outras pessoas com uma pergunta semelhante também sabem o que funcionou.
gersht
0

Em princípio, deve ser aparente na página de ajuda help(function)ou ?functionfornecer a resposta.

saudic
fonte
Esse é um ponto de partida recomendado. Se você quiser usar funções vetorizadas sempre que possível no programa que você escreve, isso pode ser um pouco de carga adicional.
Anon Mousy
1
Isso realmente não responde à pergunta. É apenas uma sugestão para a RTM.
IRTFM 26/10/19