Запись инструмента для очистки и большего количества модульного синтаксического анализатора команды

Редактировать, чтобы объединить положения полос facet_wrap с размерами свободных панелей facet_grid

(Примечание: я увеличил размеры сегментов, потому что их было действительно трудно увидеть. ..)

# data d was created with set.seed(123)

# generate plot without either facet option
p <- d %>%
  arrange(organism_name, desc(protein_length)) %>%
  mutate(protein_name = factor(protein_name, 
                               levels = unique(protein_name))) %>%      
  ggplot(aes(x = 1, xend = protein_length, 
             y = protein_name, yend = protein_name)) +
  geom_segment(color = rgb(0, 0, 0), size = 4) +
  geom_segment(aes(x = start, xend = end, y = protein_name, 
                   yend = protein_name, color = as.factor(group)),
               size = 3) +
  scale_x_continuous(breaks = seq(0,500,100), labels = seq(0,500,100)) +
  scale_y_discrete(label = NULL, drop = T) +
  scale_color_manual(values = c("firebrick1", "dodgerblue1", "darkgoldenrod1")) +
  theme_minimal() + 
  labs(color = "Group", y = "Proteins", x = "Amino Acid Position") +
  theme(axis.title.x = element_text(size = 15, face = "bold", vjust = 0.5), 
        axis.text.x = element_text(size = 12),
        panel.grid.minor.x = element_blank(),
        axis.title.y = element_text(size = 15, face = "bold", vjust = 0.5), 
        panel.grid.major.y = element_blank(), 
        panel.grid.minor.y = element_blank(),
        legend.title = element_text(size = 15, face = "bold"), 
        legend.text = element_text(size = 12))

# create two versions of the plot using facet_grid / facet_wrap, 
# with scales set to "free_y" for both, but also space = "free_y" for facet_grid
# (facet_wrap doesn't have this option)
p.grid <- p + facet_grid(organism_name ~ ., scales = "free_y", space = "free_y")
p.wrap <- p + facet_wrap(~ organism_name, ncol = 1, scales = "free_y")

# convert both into grob objects
gp.grid <- ggplotGrob(p.grid)
gp.wrap <- ggplotGrob(p.wrap)

# apply the panel heights of the facet_grid version to the facet_wrap one
gp.wrap$heights[gp.wrap$layout[grep("panel", gp.wrap$layout$name), "t"]] <- 
  gp.grid$heights[gp.grid$layout[grep("panel", gp.grid$layout$name), "t"]]

# plot the facet_wrap version
grid::grid.draw(gp.wrap)

2nd plot

Оригинальный ответ

Похоже, вы выглядите для facet_grid вместо facet_wrap. Это позволяет изменять разрывы осей и высоты граней, если вы установите scales и amp; space - "free_y":

d %>%
  arrange(organism_name, desc(protein_length)) %>%
  mutate(protein_name = factor(protein_name, 
                               levels = unique(protein_name))) %>%      
  ggplot(aes(x = 1, xend = protein_length, 
             y = protein_name, yend = protein_name)) +
  geom_segment(color = rgb(0, 0, 0), size = 1) +
  geom_segment(aes(x = start, xend = end, y = protein_name, 
                   yend = protein_name, color = as.factor(group)),
               size = 0.7) +
  scale_x_continuous(breaks = seq(0,500,100), labels = seq(0,500,100)) +
  scale_y_discrete(label = NULL, drop = T) +
  scale_color_manual(values = c("firebrick1", "dodgerblue1", "darkgoldenrod1")) +
  facet_grid(organism_name ~ ., drop = T,
             scales = "free_y", space = "free_y") +
  theme_minimal() + 
  labs(color = "Group", y = "Proteins", x = "Amino Acid Position") +
  theme(axis.title.x = element_text(size = 15, face = "bold", vjust = 0.5), 
        axis.text.x = element_text(size = 12),
        panel.grid.minor.x = element_blank(),
        axis.title.y = element_text(size = 15, face = "bold", vjust = 0.5), 
        panel.grid.major.y = element_blank(), 
        panel.grid.minor.y = element_blank(),
        legend.title = element_text(size = 15, face = "bold"), 
        legend.text = element_text(size = 12))

plot

8
задан skaffman 15 May 2011 в 12:48
поделиться

2 ответа

да, существует более простой/лучше путь, особенно в Java или других языках OO.

Основное понимание, во-первых, то, что Ваш синтаксический анализатор команды является конечным автоматом: Начальное состояние является пустой строкой (или индекс в начале строки).

Давайте думать о echo:

$ echo foo bat "bletch quux"
  1. маркируйте строку в части:

    "повторите" "нечто" "панель" "bletch quux"

  2. в оболочке грамматика обычно является существительным существительного существительного глагола..., так интерпретируйте его тот путь. Вы CAN делает это с последовательностью того, если еще, если вещи, но хеш лучше. Вы загружаете хеш строками как индексы и индексируете что-то еще. Это могло быть просто число, которое войдет в переключатель:

(это - псевдокод):

  Hashtable cmds = new Hashtable();
  enum cmdindx { ECHO=1, LS=2, ...}
  cmds.add("echo", ECHO); // ...

  // get the token into tok
  switch (cmds.get(tok)) {
     case ECHO: // process it
       // get each successor token and copy it to stdout
       break;
     ...
     default:
        // didn't recognize the token
        // process errors
   }

ЕЩЕ лучше можно применить Команду и Объектные Шаблоны "фабрика". Теперь у Вас есть класс Команда

  public interface Command {
     public void doThis(String[] nouns) ;
     public Command factory();
  }

  public class Echo implements Command {
     public void doThis(String[] nouns){
         // the code is foreach noun in nouns, echo it
     }
     public Command factory(){
         // this clones the object and returns it
     }
  }

Теперь, Ваш код становится

  // Load the hash
  Hashtable cmds = new Hashtable();
  cmds.add("echo", new Echo());  // one for each command


  // token is in tok
  // the "nouns" or "arguments are in a String[] nouns
  ((cmds.get(tok)).factory()).doThis(nouns);

Посмотрите, как это работает? Вы ищете объект в хеше. Вы звоните factory метод для получения новой копии. Вы затем вызываете обработку для той команды с помощью doThis метод.

Обновление

Это может быть немного слишком общим, в котором это использует Шаблон "фабрика". Почему имеет метод фабрики? Главным образом Вы использовали бы это так, чтобы каждый раз Вы выполнили команду, объект "глагола" (как экземпляр Echo) может иметь его собственное внутреннее состояние. Если Вы не должны заявлять для сохранения в течение долгого времени, можно упростить это до

  (cmds.get(tok)).doThis(nouns);

Теперь это просто получает и использует Echo возразите, что Вы создали когда Вы instanciated это с cmds.add("echo", new Echo());.

2
ответ дан 6 December 2019 в 00:59
поделиться

Вы посмотрели на выполнение диспетчеризации с Картой? hashmap было бы довольно легко поместить там. Просто сделайте ключ командой и сделайте интерфейсный или абстрактный класс, который является командой как это:

interface Commmand {
   void execute(String args);
}

Или еще лучше Вы могли нарубить аргументы заранее:

interface Commmand {
   void execute(String[] args);
}

Затем Ваш Вы использовали бы HashMap <Строка, Команда>.

1
ответ дан 6 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: