Como if () funciona em planilhas org?

Oct 10 2020

Tive a impressão do manual que

    | a |   |
    | b |   |
    #+TBLFM: $2=if($-1==a, 1, 0)

deve produzir "1" na primeira linha e "0" na segunda. Mas em vez disso eu recebo

    | a |             1 |
    | b | b = a ? 1 : 0 |
    #+TBLFM: $2=if($-1==a, 1, 0)

O que estou entendendo mal aqui?

Respostas

4 NickD Oct 11 2020 at 00:49

Provavelmente, é melhor usar fórmulas Lisp para coisas como essa. Como mostra a resposta de @ db48x, há alguns cozinheiros naquela cozinha e o que eles estão fazendo nem sempre é óbvio. A depuração de fórmula pode ajudar, mas nem sempre é eficaz (presumo que foi assim que @ db48x descobriu a coisa "(a)", mas pode não ser o caso).

Eu acho as conversões de string imprevisíveis, então para coisas não numéricas em particular, eu tendo a ficar longe de fórmulas de cálculo e fazer isso em Lisp.

Neste caso específico, tente o seguinte:

| a | 1 |
| b | 0 |
#+TBLFM: $2 = '(if (string= $-1 "a") 1 0)

A desvantagem (?) É que você tem que aprender um pouco do Lisp, mas isso é bom: caso contrário, como você vai mexer com todas as configurações do Emacs?

3 db48x Oct 10 2020 at 19:25

Não sei exatamente o que está acontecendo aqui, mas depois de fazer uma pequena depuração, descobri que funciona:

| a |   |
| b |   |
#+TBLFM: $2=if("$1"=="(a)", 1, 0)

Parece-me que está fazendo uma simplificação algébrica para obter uma resposta e, se isso falhar, pode ficar com uma forma mais complicada do que você esperava. b = a ? 1 : 0é uma expressão ternária que não foi avaliada para um valor, provavelmente porque ae bsão tratadas como variáveis ​​em vez de strings. Portanto, você tem que colocá-los entre aspas, mas então "$ -1" avalia como uma string com parênteses por razões desconhecidas, então você deve incluir esses parênteses no outro lado da equação também.