как передать функцию или функции между блоками src в режиме org (вместо этого используйте: session, используйте: var или другие) - PullRequest
0 голосов
/ 26 мая 2019

Я хочу разделить функцию между различными блоками src в режиме org.Конечно, мы могли бы использовать :session в режиме org.Однако это может привести к ошибкам, если имена переменных совпадают.

Я бы хотел использовать эту функцию несколько раз в разных сессиях.Как мне это сделать?Я пытаюсь :var, но мне не удалось передать функции, такие как :var theme_ls1=theme;:var theme_ls1()=theme.

Было бы лучше, если бы функция сохраняла форму theme_ls() во втором блоке src.Может быть, мы можем включить блоки src в один файл org.

Я показываю правильный пример, используя :session.

* block 1
  #+NAME: theme
  #+BEGIN_SRC R :session info :exports none
    ## Theme for plot
    theme_ls1 <- function(..., bg='white'){
    require(grid)
    theme_classic(...) +
        theme(
        panel.background=element_rect(fill='transparent', color='blue'),
        panel.border=element_rect(fill='transparent', color='transparent'),
        panel.grid=element_blank(),
        plot.margin=unit(c(0.4,0.4,0.4,0.4),"mm")
        )
    }
  #+END_SRC

* block 2
  #+BEGIN_SRC R :exports results :results output graphics :session info :file exp1.1.png :width 400 :height 300
    #!/usr/bin/env Rscript
    ## library
    library(ggplot2)

    ## data
    dt <- data.frame(x=-6:6, y=-6:6)

    ## pic
    pp1 <- ggplot(data=dt, aes(x=x, y=y))+
    geom_point()+
    scale_x_continuous(limits=c(-6,6), breaks=-6:6)+
    scale_y_continuous(limits=c(-6,6), breaks=-6:6)+
    theme_ls1()
    pp1
  #+END_SRC

Ссылка: https://emacs.stackexchange.com/questions/19073/org-mode-passing-variables-between-code-blocks-without-sessions, но отличается

1 Ответ

0 голосов
/ 26 мая 2019

Я не очень понимаю, почему вы не хотите использовать здесь сеанс - проблемы с переменными должны быть проблемой - в противном случае я думаю, что правильный дизайн поместил бы ваш повторно используемый код в правильное пространство имен.

Но, похоже, уродливым обходным путем может быть использование eval(parse(...)), что обычно считается плохой практикой.

* block 1
#+NAME: theme
#+BEGIN_SRC R :exports none :results output
## Theme for plot
theme_ls1 <- function(..., bg='white'){
    require(grid)
    theme_classic(...) +
        theme(
            panel.background=element_rect(fill='transparent', color='blue'),
            panel.border=element_rect(fill='transparent', color='transparent'),
            panel.grid=element_blank(),
            plot.margin=unit(c(0.4,0.4,0.4,0.4),"mm")
        )
}
theme_ls1
#+END_SRC


* block 2
#+BEGIN_SRC R :exports results :results output graphics :var theme_ls1=theme :file exp1.1.png :width 400 :height 300

library(ggplot2)
theme_ls1 <- eval(parse(text=theme_ls1))

## data
dt <- data.frame(x=-6:6, y=-6:6)

## pic
pp1 <- ggplot(data=dt, aes(x=x, y=y)) +
    geom_point() +
    scale_x_continuous(limits=c(-6,6), breaks=-6:6) +
    scale_y_continuous(limits=c(-6,6), breaks=-6:6) +
    theme_ls1()
pp1
#+END_SRC
...