Как сделать функцию в R с большим количеством кода? - PullRequest
0 голосов
/ 28 июня 2018

Я думаю, что это довольно простой вопрос, так как я новый пользователь R, но я хочу сделать так, чтобы я мог активировать весь код ниже с помощью одной записи / слова (я предполагал, что это будет функция) , Если об этом уже спрашивали, я прошу прощения, и, пожалуйста, направьте меня по ссылке, где ответили. Заранее благодарю за помощь. Мой код:

head(yelp, 10)
str(yelp)
yelp_flat<- flatten(yelp)
str(yelp_flat)
library(tibble)
yelp_tbl <- as_data_frame(yelp_flat)
yelp_tbl
yelp_tbl$newcolumn <- NULL
yelp_tbl$newcolumn1 <- NULL
yelp_tbl$shotClock <- NULL
yelp_tbl$period <- NULL
yelp_tbl$wallClock <- NULL
yelp_tbl$gameClock <- NULL
yelp_tbl$gameClockStopped <- NULL
yelp_tbl$ball <- NULL
head(yelp_tbl)
good <- unnest(yelp_tbl) #extracts xyz from original dataframe
library(tidyr)
player <- good %>% separate(xyz, c("player_x", "player_y", "player_z"), sep = ",")
finish <- player %>% separate(xyz1, c("player_x", "player_y", "player_z"), sep = ",")
k <- finish %>% separate(player_x, c("trash", "player_x"), sep = "c")
k$trash <- NULL
r <- k %>% separate(player_z, c("player_z", "tra"), sep = "\\)")
u <- r %>% separate(player_x, c("kol", "player_x"), sep = "\\(")
Away_Team <- u
Away_Team$garbage <- NULL
Away_Team$playerId1<- NULL
Away_Team$aplayer_x <- NULL
Away_Team$aplayer_y <- NULL
Away_Team$aplayer_z <- NULL
Away_Team$dispose <- NULL
Away_Team$brack <- NULL
Away_Team$kol <- NULL
Away_Team$tra <- NULL
View(Away_Team)
yelp_tbl
yelp_tbl$newcolumn <- NULL
yelp_tbl$newcolumn1 <- NULL
yelp_tbl$shotClock <- NULL
yelp_tbl$period <- NULL
yelp_tbl$wallClock <- NULL
yelp_tbl$gameClock <- NULL
yelp_tbl$gameClockStopped <- NULL
yelp_tbl$ball <- NULL
head(yelp_tbl)
good <- unnest(yelp_tbl) #extracts xyz from original dataframe
library(tidyr)
player <- good %>% separate(xyz, c("player_x", "player_y", "player_z"), sep = ",")
finish <- player %>% separate(xyz1, c("player_x", "player_y", "player_z"), sep = ",")
k <- finish %>% separate(player_x, c("trash", "player_x"), sep = "c")
k$trash <- NULL
r <- k %>% separate(player_z, c("player_z", "tra"), sep = "\\)")
u <- r %>% separate(player_x, c("kol", "player_x"), sep = "\\(")
Home_Team <- u
Home_Team$garbage <- NULL
Home_Team$playerId1<- NULL
Home_Team$hplayer_x <- NULL
Home_Team$hplayer_y <- NULL
Home_Team$hplayer_z <- NULL
Home_Team$dispose <- NULL
Home_Team$brack <- NULL
Home_Team$kol <- NULL
Home_Team$tra <- NULL
View(Home_Team)
View (Away_Team)
Table <- rbind(Home_Team, Away_Team)
View(Table) #order frameIdx to see correct order

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Итак, действительно, вы должны сделать функцию. Вот несколько шагов, которым нужно следовать:

1. Поместите весь свой код в вашу функцию

my_function <- function(){
   # Your code
}

2. Определите, что у вас есть в качестве ввода (иначе, что вы не строите в своем коде), они станут аргументом вашей функции

my_function <- function(arg1, arg2, ...){
   # Your code
}

В вашем примере я определил yelp

3. Определите, что вы хотите вывести (в идеале только один объект), они будут в return вашей функции

my_function <- function(arg1, arg2, ...){
  # Your code
  return(output)
}

В вашем примере я определил Table

4. Возьмите весь импорт / библиотеку и поместите их за пределы вашей функции

library(lib1)
my_function <- function(arg1, arg2, ...){
  # Your code
  return(output)
}

РЕДАКТИРОВАТЬ с использованием предложения @ r2evans: обычно используется library вместо require, здесь и здесь - некоторая литература по этому вопросу. В вашем коде я определил tidyr и tibble

5. Определите, что вы хотите напечатать / View и что было только для отладки. Добавьте печать в печать, подавив то, что вы не хотите

6. Добавить некоторые комментарии / нарезать код

Например, я бы добавил что-то вроде # Creating XXX table

7. Улучшение качества кода

Вы должны попытаться минимизировать количество строк кода (например, используя циклы и избегая двойного кода). Сделать имена переменных явными (вместо k, u, r ...)

Что касается цикла, то в вашем коде вы добавляете несколько столбцов за раз, вы можете сделать цикл для их упорядочения. (Это то, что я сделал ниже). Это помогает сделать ваш код легче для чтения / отладки. В данном конкретном случае, как сказал Грегор, небезызвестно быстрее отбросить их все сразу, используя список имен столбцов (если вам интересно, проверьте его комментарий).


Вот, пожалуйста,

Есть еще некоторые улучшения, особенно в отношении пунктов 7 и 5.

library(tibble)
library(tidyr)

yelp_function <- function(yelp){
  # Printing the input
  print(head(yelp, 10))
  print(str(yelp))

  # Flatten table
  yelp_flat<- flatten(yelp)
  print(str(yelp_flat))

  # Create yelp_tbl and drop some columns
  yelp_tbl <- as_data_frame(yelp_flat)
  # Drop some columns
  for (col in c("newcolumn", "newcolumn1", "shotClock", "period", "wallClock", "gameClock", "gameClockStopped", "ball")){
    yelp_tbl[, col] <- NULL
  }

  print(head(yelp_tbl))

  # Build some table
  good <- unnest(yelp_tbl) #extracts xyz from original dataframe
  player <- good %>% separate(xyz, c("player_x", "player_y", "player_z"), sep = ",")
  finish <- player %>% separate(xyz1, c("player_x", "player_y", "player_z"), sep = ",")
  k <- finish %>% separate(player_x, c("trash", "player_x"), sep = "c")
  k$trash <- NULL
  r <- k %>% separate(player_z, c("player_z", "tra"), sep = "\\)")
  u <- r %>% separate(player_x, c("kol", "player_x"), sep = "\\(")

  # Build away team
  Away_Team <- u

  # Build yelp table: I'm not quite sure why you are rebdoing that... Is this code necessary?
  yelp_tbl
  # Drop some columns
  for (col in c("newcolumn", "newcolumn1", "shotClock", "period", "wallClock", "gameClock", "gameClockStopped", "ball")){
    yelp_tbl[, col] <- NULL
  }

  print(head(yelp_tbl))
  good <- unnest(yelp_tbl) #extracts xyz from original dataframe

  # Build some table
  player <- good %>% separate(xyz, c("player_x", "player_y", "player_z"), sep = ",")
  finish <- player %>% separate(xyz1, c("player_x", "player_y", "player_z"), sep = ",")
  k <- finish %>% separate(player_x, c("trash", "player_x"), sep = "c")
  k$trash <- NULL
  r <- k %>% separate(player_z, c("player_z", "tra"), sep = "\\)")
  u <- r %>% separate(player_x, c("kol", "player_x"), sep = "\\(")

  ## Build home_team
  Home_Team <- u

  # Drop some columns
  for (col in c("garbage", "playerId1", "aplayer_x", "aplayer_y", "aplayer_z", "dispose", "brack", "kol", "tra")){
    Away_Team[, col] <- NULL
    Home_Team[, col] <- NULL
  }

  # Merge
  Table <- rbind(Home_Team, Away_Team)

  # Return
  return(Table)
}

View(Table) #order frameIdx to see correct order

Запустите его:

Чтобы запустить ваш код, вам просто нужно выполнить функцию с нужным аргументом:

yelp_function(yelp)

NB 1: обратите внимание, что я не тестировал код, поскольку вы не предоставили данные для его запуска. Чтобы улучшить свой вопрос, вы должны предоставить некоторые данные, используя функцию dput.

Примечание 2: В коде всегда есть место для улучшения, так что вы можете пойти дальше и заняться рефакторингом, чтобы избежать двойного кода. Контролируйте свои входы с некоторой проверкой работоспособности ...

0 голосов
/ 28 июня 2018

Это довольно просто.

Вы делаете это:

foo <- function{
   #all your code goes here
}

Затем вы вызываете свою функцию, набрав (например, в консоли):

foo()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...