Karl Voit <devn...@karl-voit.at> writes: > Hi! Hi! > > I want to test/use Python with org-sbe: > > #+NAME: classificationfm > #+BEGIN_SRC python :exports none :var prob :var impact > > result = "" > if prob == 'high' and impact == 'high': > return 'A' > if prob == 'low' and impact == 'high': > return 'B' > if prob == 'high' and impact == 'low': > return 'C' > if prob == 'low' and impact == 'low': > return 'D' > return 'undefined' > #+END_SRC > After some trying I found that the variables as set in the source-code header need standard values set:
#+NAME: classificationfm #+BEGIN_SRC python :var prob="high" :var impact="high" if prob == "high" and impact == "high": return "A" if prob == "low" and impact == "high": return "B" if prob == "high" and impact == "low": return "C" if prob == "low" and impact == "low": return "D" #+END_SRC If I don't set them I get exactly the same errors as you. Like this I get the following: | prob | impact | class | |------+--------+-------| | high | high | A | | low | high | B | | high | low | C | | low | low | D | #+TBLFM: @2$3..@>$3='(org-sbe classificationfm (prob $$1) (impact $$2)) Evaluation is being asked for each line then. > (Yes, I should move to elif and the Python code might be coded with > less characters in general: this should not be the point here ;-) ) > > | prob | impact | class | > |------+--------+--------| > | high | high | #ERROR | > | low | high | #ERROR | > | high | low | #ERROR | > | low | low | #ERROR | > > #+TBLFM: @2$3..@>$3='(org-sbe "classificationfm" (prob $1) (impact $2)) > > I'd expect to get the values of the "class" table column: A, B, C, D > instead of #ERROR. > > > Reading the manual, I found: > | NOTE: By default, string variable names are interpreted as > | references to source-code blocks, to force interpretation of a > | cell’s value as a string, prefix the identifier a "$" (e.g.,"$$2" > | instead of "$2" or "$@2$2" instead of "@2$2"). > > Therefore, I tried the following lines ... > > #+TBLFM: @2$3..@>$3='(org-sbe "classificationfm" (prob "$1") (impact "$2")) > #+TBLFM: @2$3..@>$3='(org-sbe "classificationfm" (prob $$1) (impact $$2)) > > #+TBLFM: @2$3..@>$3='(org-sbe "classificationfm" (prob "$$1") (impact "$$2")) > ... all with same error in the result. > > > My setup: Org mode version 9.1.6 on GNU Emacs 26.0.90 and GNU Emacs 25.1.1 > > > I started a reddit thread[1]. In this thread, somebody was posting > this table showing the error: > > #+NAME: myfunc > #+BEGIN_SRC python :var n="1" > > return "ok" > #+END_SRC > > | 10.3 | 9 | -18 | a | 14 | 11 | 1 | > | ok | ok | ok | #ERROR | ok | ok | ok | > > #+TBLFM: @2='(org-sbe myfunc (n @1)) > > > However, using the comment from the manual about strings, I > prepended the reference with "$" ... > > | 10.3 | 9 | -18 | a | 14 | 11 | 1 | > | ok | ok | ok | ok | ok | ok | ok | > > #+TBLFM: @2='(org-sbe mytestfunc (n $@1)) > > ... which now looks OK ;-) > > > So, back to the initial situation: what is my error or do we have a > bug in Org? > > > [1] > https://www.reddit.com/r/orgmode/comments/b0ll1v/embedding_python_code_in_table_formula/ I hope this helps, I'm on orgmode 8.2.1 here. Cheers, Daniel