SwiftR Switcheroo: Chamando [Compiled] Rápido de R!

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br

[ad_1]

[This article was first published on R – rud.is, and kindly contributed to R-bloggers]. (Você pode relatar problemas sobre o conteúdo desta página aqui)


Quer compartilhar seu conteúdo em R-bloggers? clique aqui se você tiver um blog, ou aqui se não tiver.

Eu estou em um Swift + R bender há um tempo, mas tenho inveja do macOS / iOS puro (et al), que começa a usar as bibliotecas de aprendizado de máquina realmente ++ boas da Apple, que são ainda mais robustas no novo hardware M1 (é legal ter componentes de hardware dedicados a melhorar o desempenho dos modelos construídos).

Claro, é muito simples fazer um utilitário de linha de comando que pode pegar dados de entrada, executá-los por meio de modelos e, em seguida, transportar os dados de volta para R, mas achei que era hora de Swift receber o tratamento “Rust” e “Go” em termos de permitir que R chame o código Swift compilado diretamente. Felizmente, nada disso envolve o uso de Xcode, pois é um dos piores IDEs do mundo.

Para jogar em casa você precisará do macOS e pelo menos as ferramentas de linha de comando instaladas (eu não pensar isso requer uma instalação completa do Xcode, mas vocês podem me informar se isso acontecer nos comentários). Se você pode entrar swiftc em um prompt de terminal e volte :0: error: no input files então você está pronto para ir.

Olá, Swift!

Para manter esta postagem curta (já que irei adicionar todo esse conceito ao tomo do SwiftR), estaremos superconcentrados e apenas construir uma biblioteca compartilhada que podemos carregar dinamicamente em R. Essa biblioteca terá uma função que será para deixar-nos dizer olá ao planeta com uma saudação personalizada.

Leia Também  Avonhurst contrata novo número de parceiros em apenas dois meses

Faça um novo diretório para este esforço (chamei o meu greetings) e criar um greetings.swift arquivo com o seguinte conteúdo:

NOTA: Substitua um sinal @ real pelo @ usado aqui. Uma das extensões que convertem @ – coisas automaticamente em links do Twitter é interrompida e transforma todas elas em links do Twitter.

Todo esse código também está nesta essência.

@_cdecl("greetings_from")
public func greetings_from(_ who: SEXP) -> SEXP {
  print("Greetings, 🌎, it's (String(cString: R_CHAR(STRING_ELT(who, 0))))!")
  return(R_NilValue)
}

Antes de explicar o que está acontecendo lá, crie também um geetings.h arquivo com o seguinte conteúdo:

#define USE_RINTERNALS

#include 
#include 

const char* R_CHAR(SEXP x);

No arquivo Swift, há uma única função que leva um R SEXP e o converte em um Swift String que é então encaminhado para stdout (não é um “ótimo” idioma R, mas benigno o suficiente para um exemplo de introdução). As funções do Swift não são funções C e, por si só, não aderem às convenções de chamada C. Infelizmente, a capacidade do R de trabalhar com código de biblioteca dinâmica exige que esse contrato esteja em vigor. Felizmente, o Swift Language Overlords nos forneceu a capacidade de instruir o compilador a criar o código da biblioteca que forçará as convenções de chamada a serem semelhantes ao C (é isso que o @cdecl é para).

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br

Estamos usando SEXP, algumas funções da interface R C e até mesmo a versão C do NULL no código Swift, mas não fizemos nada no arquivo Swift para informar ao Swift sobre a existência desses elementos. É para isso que serve o arquivo de cabeçalho C (adicionei o R_CHAR declaração já que macros C complexas não funcionam em Swift).

Agora, tudo o que precisamos fazer é garantir que o compilador saiba sobre o arquivo de cabeçalho (que é uma “ponte” entre C e Swift), onde está o framework R, e que queremos gerar uma biblioteca vs um arquivo executável binário como nós compilamos o código. Certifique-se de estar no mesmo diretório que os .swift e .h arquivo e execute o seguinte em um prompt de terminal:

swiftc 
  -I /Library/Frameworks/R.framework/Headers  # where the R headers are
  -F/Library/Frameworks                       # where the R.framework lives
  -framework R                                # we want to link against the R framework
  -import-objc-header greetings.h             # this is our bridging header which will make R C things available to Swift
  -emit-library                               # we want a library, not an exe
  greetings.swift                              # our file!

Se tudo correr bem, você deve ter um libgreetings.dylib biblioteca compartilhada nesse diretório.

Leia Também  Cursos de ciência de dados para economistas e epidemiologistas usando o RTutor

Agora, inicie uma sessão de console R nesse diretório e faça:

greetings_lib 

If there are no errors, the shared library has been loaded into your R session and we can use the function we just made! Let’s wrap it in an R function so we’re not constantly typing .Call(…):

greetings_from 

I also took the opportunity to make sure we are sending a length-1 character vector to the C/Swift function.

Now, say hello!

greetings_from("hrbrmstr")

E você deve ver:

Greetings, 🌎, it's hrbrmstr!

FIM

Pararemos por aí por enquanto, mas espero que esta pequena introdução tenha mostrado como pode ser simples conectar o Swift & R na outra direção.

Eu terei outro post que mostra como estender este exemplo de brinquedo para usar uma das bibliotecas de processamento de linguagem natural da Apple, e posso até fazer mais um sobre como colocar tudo isso em um pacote antes de desviar todos os posts individuais para alguns livros capítulos.



[ad_2]

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br