Bloquage avec le concept de Computing correlation dans Éloquent Javascript

Salut à tous les codeurs Js de la plateforme, je suis rendu à peu près au milieu du chapitre 4 de Éloquent Javascript et j’aurais besoin d’aide avec un problème concernant la partie « Computing correlation ». Contexte, l’auteur nous donne un array de nombre qui sont sensé représenter un tableau de 2x2 : [76, 9, 4, 1]. Il nous dis que nous devons interpreter les indices en nb binaire. Chaque table est associé à des variables: (squirrel, event). Cela représente les fois ou un garçon nommé « Jacque » se transforme en écureuil":

-Le nombre binaire « 10 » réfère au cas où Jacque s’est transformé en écureuil mais que « l’event » ne s"est pas produit.

-Le nombre binaire « 01 » réfère au cas où Jacque ne s’est pas transformer en écureuil mais que que l’event s’est produit

-Le nombre binaire « 11 » réfère au cas où Jacque s’est transformer et que l’event s’est produit

-Le nombre binaire « 00 » réfère au cas où Jacque ne s’est pas transformer en écureuil et l’event ne s’est pas produit.

Si jamais j’ai manqué un détail je vous laisse le pdf du chapitre 4: Data Structures: Objects and Arrays :: Eloquent JavaScript

On nous dis que le gars a gardé son journal pendant 3 mois et voici le résultat: (Eloquent JavaScript :: Code Sandbox),

Interrogation: pourquoi est ce que lorsque j’essaye de copier le code de la sandbox dans ma console, je reçois une erreur comme quoi la fonction journalEvents n’est pas définie:

for (let event of journalEvents(JOURNAL)) {
  let correlation = phi(tableFor(event, JOURNAL));
  if (correlation > 0.1 || correlation < -0.1) {
    console.log(event + ":", correlation);
  }
}
VM76:1 Uncaught ReferenceError: journalEvents is not defined
    at <anonymous>:1:19
(anonyme) @ VM76:1

Alors que quand je le « run » localement dans la console du fichier html: ( chapter/04_data.zip) le code arrive à définir la fonction « journalEvents »

for (let event of journalEvents(JOURNAL)) {
  let correlation = phi(tableFor(event, JOURNAL));
  if (correlation > 0.1 || correlation < -0.1) {
    console.log(event + ":", correlation);
  }
}

//weekend: 0.13719886811400708 [debugger eval code:4:13](chrome://devtools/content/webconsole/debugger eval code)

//brushed teeth: -0.3805211953235953 [debugger eval code:4:13](chrome://devtools/content/webconsole/debugger eval code)

candy: 0.12964074471043288 [debugger eval code:4:13](chrome://devtools/content/webconsole/debugger eval code)

//work: -0.13719886811400708 [debugger eval code:4:13](chrome://devtools/content/webconsole/debugger eval code)

//spaghetti: 0.242535625036333 [debugger eval code:4:13](chrome://devtools/content/webconsole/debugger eval code)

//reading: 0.11068280537595927 [debugger eval code:4:13](chrome://devtools/content/webconsole/debugger eval code)

//peanuts: 0.59026798116852

Comme si la fonction « journalEvents » était déjà « implémenter » dans le fichier.

Si c’est le cas, est-ce que quelqu’un d’entre vous saurais comment cela fonctionne ?

Merci d’avance à vous tous !

@Renaud,

Il est possible que la fonction journalEvents ne soit pas définie lorsque tu essaies de copier le code de la sandbox dans ta console car elle est déjà implémentée dans le fichier HTML. La fonction journalEvents est une méthode qui permet aux navigateurs web de lire et d’exécuter du code JavaScript. Lorsque vous chargez un fichier HTML, les navigateurs web recherchent automatiquement des balises et exécutent le code JavaScript qu’elles contiennent. Cela signifie que vous n’avez pas besoin de définir manuellement la fonction journalEvents dans votre console car elle est déjà implémentée dans le fichier HTML.

2 « J'aime »

@Robolivier pourrais tu me dire comment fonctionne ce code:

 function tableFor(event, journal) {
   let table = [0, 0, 0, 0];
   for (let i = 0; i < journal.length; i++) {
     let entry = journal[i], index = 0;
     if (entry.events.includes(event)) index += 1;
     if (entry.squirrel) index += 2;
     table[index] += 1;
}
   return table;
 }
console.log(tableFor("pizza", JOURNAL)); // → [76, 9, 4, 1]

plus particulièrement index += 2

Le code ci-dessus est une fonction qui calcule la corrélation entre un événement et un journal. La ligne index += 2 indique que si l’entrée du journal contient le mot-clé squirrel, alors l’index sera incrémenté de 2. Cela signifie que si le journal contient le mot-clé squirrel, la valeur de l’index sera augmentée de 2, ce qui ajoutera 2 à la valeur finale dans le tableau.

1 « J'aime »

Maladeeee !! Merci @Olivier_Lambert pour la nouvelle fonctionnalité !!

1 « J'aime »

Salut tout le monde, finalement je n’ai pas pu réelement comprendre avec les explications de robolivier et j’aurais besoin d’aide pour démêler tout ça. À la page 67, comme je l’avais dis précédemment, l’auteur nous donne les données du journal de « Jacque » après 3 mois placés dans le binding « JOURNAL » : (Eloquent JavaScript :: Code Sandbox).

 for (let event of journalEvents(JOURNAL)) {
  let correlation = phi(tableFor(event, JOURNAL));
  if (correlation > 0.1 || correlation < -0.1) {
    console.log(event + ":", correlation);
  }
}

Première chose, je n’ai pas compris la première for loop:

for (let event of journalEvents(JOURNAL))

Je ne suis pas habitué à ce genre de for loop et je ne vois pas son utilité et comment elle fonctionne. Surtout le « of ».

Ensuite, il y avais tellement de fonction l’une sur les autre qui n’étais même pas définie directement dans le code mais dans un fichier externe que je me suis vite mélangé avec les paramètres de la fonctions, les bindings et les fonctions elle même. Je vais mettre mes questions en ordre pour que ça soit plus clair:

-Comment fonctionnent la fonction journalEvents et à quoi elle sert

-Comment fonctionne la fonction tableFor et à quoi elle sert

Je prend ma chance pour redemander à @robolivier mais si quelqu’un d’entre vous pourrait m’éclaircir ça me ferait vraiment plaisir !

Merci d’avance !

Salut @Renaud,

Je comprends que tu as des difficultés à comprendre le code et je vais essayer de t’aider.

La fonction journalEvents est une fonction qui prend en paramètre un journal et qui retourne un tableau d’événements. Elle sert à itérer sur chaque événement du journal pour effectuer des calculs.

La fonction tableFor est une fonction qui prend en paramètre un événement et un journal et qui retourne une table de contingence. Elle sert à calculer la corrélation entre l’événement et les autres événements du journal.

J’espère que ces explications t’ont aidé ! Si tu as d’autres questions, n’hésite pas à me les poser !

Dans le fond, les fonctions sont déjà défini par la sandbox!

Utilise cette sandbox à la place, c’est plus simple de comprendre.

Je t’ai mis en lien le fichier où les foncitons sont définies.

2 « J'aime »

@robolivier, explique cette fonction:

export function tableFor(event, journal) {
  let table = [0, 0, 0, 0];
  for (let i = 0; i < journal.length; i++) {
    let entry = journal[i],
      index = 0;
    if (entry.events.includes(event)) index += 1;
    if (entry.squirrel) index += 2;
    table[index] += 1;
  }
  return table;
}

La fonction tableFor prend en paramètres un événement et un journal et retourne une table. La fonction parcourt le journal et pour chaque entrée, elle vérifie si l’événement est inclus dans la liste des événements de l’entrée. Si c’est le cas, elle ajoute 1 à l’index. Si la propriété squirrel est vraie, elle ajoute 2 à l’index. Enfin, elle incrémente la valeur correspondante dans la table.

La table retournée est une liste de 4 nombres qui représentent le nombre d’occurrences de chaque combinaison possible entre l’événement et la propriété squirrel. Les 4 nombres sont les suivants:

  • 0: L’événement n’est pas présent et la propriété squirrel est fausse
  • 1: L’événement est présent mais la propriété squirrel est fausse
  • 2: L’événement n’est pas présent mais la propriété squirrel est vraie
  • 3: L’événement est présent et la propriété squirrel est vraie

@Robolivier, explique cette fonction:

export function journalEvents(journal) {
  let events = [];
  for (let entry of journal) {
    for (let event of entry.events) {
      if (!events.includes(event)) events.push(event);
    }
  }
  return events;
}

La fonction journalEvents prend un journal en paramètre et retourne un tableau d’événements. La fonction parcourt chaque entrée du journal et ajoute chaque événement à un tableau si l’événement n’est pas déjà présent dans le tableau.

En d’autres termes, la fonction journalEvents permet de calculer la corrélation entre les entrées du journal et les événements associés.

@Robolivier Explique moi cette ligne: for (let event of journalEvents(JOURNAL))

La ligne for (let event of journalEvents(JOURNAL)) est une boucle for...of qui itère sur les événements du journal. La fonction journalEvents() prend en paramètre un objet JOURNAL et retourne un tableau d’événements. Chaque événement est alors assigné à la variable event, qui peut être utilisée pour effectuer des opérations sur chaque élément du tableau.

Dans le fond, ce n’est pas très compliqué! Il faut juste te familiariser avec la structure.

for ( ) veut dire "Continue d’exécuter ce qui se trouve entre { } tant que la condition à l’intérieur des parenthèse est vraie.

let event veut simplement dire que tu définie la variable « event » qui va représenter une entrée présente dans ton « array » journalEvents(JOURNAL).

Donc, dans ta loop, tu passe chaque événement un à un.

Ça peut être mêlant de savoir ce qui est quoi alors je te recommande de simplement logger les variables dans ta console! Ex:

for (let event of journalEvents(JOURNAL)) {
 console.log("event: " + event, "journal: " + JOURNAL);
}

Est-ce que let event of journalEvents(JOURNAL) pourrait être écris comme ça: event.journalEvents(JOURNAL) ou il faut bien mettre le binding « let » ?

@Robolivier ce code est-il valide: event.journalEvents(JOURNAL)

Non, ce code n’est pas valide. Le concept de Computing correlation dans Éloquent Javascript ne prend pas en charge l’utilisation de la méthode event.journalEvents(). Vous devriez plutôt utiliser une méthode qui est spécifiquement conçue pour le type de données que vous souhaitez traiter.

1 « J'aime »

@Robolivier Dans ce code:

 function tableFor(event, journal) {
   let table = [0, 0, 0, 0];
   for (let i = 0; i < journal.length; i++) {
     let entry = journal[i], index = 0;
     if (entry.events.includes(event)) index += 1;
     if (entry.squirrel) index += 2;
     table[index] += 1;
}
   return table;
 }

explique moi:

  • for (let i = 0; i < journal.length; i++) {

  • let entry = journal[i], index = 0;

La boucle for est une structure de contrôle qui permet d’itérer sur un tableau. Dans ce cas, la boucle for itère sur le tableau journal. La variable i est initialisée à 0 et incrémentée jusqu’à ce que sa valeur soit égale à la longueur du tableau (journal.length).

La ligne suivante, let entry = journal[i], index = 0;, assigne à la variable entry l’élément du tableau correspondant à l’index actuel (dans ce cas, l’index est égal à la valeur de la variable i). La variable index est initialisée à 0.