'Insert' a NIL value

Hi, I’m simply trying to get the Game working after it goes thru the Restart. When you try to play the game a second time,  it produces the error game.lua 300: attempt to call method ‘insert’ (a nil value). This error refers to my spawn2 function. I have tried moving functions around to fix it to no avail. Here is game file https://www.dropbox.com/s/bt4h7ngvgy40nqd/FIX.zip?dl=0

I should note that I have been using the restart.lua method of restarting the game.Also to restart the game simply drag the red square to the green square.

-------VARIABLES local background local failedSound local pickUpSound local powerUpSound local menu --local score local highScore local scoreLabel local rewardLabel local rewardBar local penaltyLabel local penaltyBar local player local objects = {} local tPrevious = system.getTimer( ) local speedFactor = 1 --------------------- local Player = require( "Player" ) local Spawn  = require( "Spawn" ) local sceneGroup, player1,spawn,timerId local composer = require( "composer" ) local scene = composer.newScene() local physics = require ("physics") --local score = require( "Score" ) physics.start() physics.setGravity( 0, 0 ) physics.setScale( 60 ) --physics.setDrawMode( "hybrid" ) --------------- FUNCTION VARIABLES --------------- -- Variables to hold the function pointers. -- This is only to have one place to show them off. local loadScores local saveScores local createPlayer local randomSpeed local calculateNewVelocity local showMenu local startGame local createMenu local gameOver local coerceOnScreen local onTouch local spawn local gameSpecial local onCollision local animate local randomSpeed --Hide the status bar. display.setStatusBar( display.HiddenStatusBar)     --local function realCollision ( event )        --------Collision Event          --if ( event.phase == "began" ) then             --composer.gotoScene( "Restart" )              --end --end local function addColumns()   local PillarCollisionFilter = { categoryBits = 10 , maskBits = 6 }       height = math.random(display.contentCenterY - 100, display.contentCenterY + 100)     topColumn = display.newRect (40, -20, 52, 280)   topColumn.objectType = "pillar"   topColumn:setFillColor( 1, 1, 1 )   topColumn.anchorX = 0.5   topColumn.anchorY = 0.9   topColumn.x = display.contentWidth + 300   topColumn.y = height - 160   topColumn.scoreAdded = false   physics.addBody(topColumn, "static",{ density=1, bounce=0.1, friction=.2, filter=PillarCollisionFilter} )   elements:insert(topColumn)   bottomColumn =  display.newRect (40, 340, 52, 280)   bottomColumn:setFillColor( 1, 1, 1 )   bottomColumn.objectType = "pillar"   bottomColumn.anchorX = 0.5   bottomColumn.anchorY = 0.65   bottomColumn.x = display.contentWidth + 300   bottomColumn.y = height + 160   physics.addBody(bottomColumn, "static", {density=1, bounce=0.1, friction=.2, filter=PillarCollisionFilter} )   elements:insert(bottomColumn)     end   local function moveColumns()     for a = elements.numChildren,1,-1  do          if(elements[a].x \> -100) then         elements[a].x = elements[a].x - 17       else         elements:remove(elements[a])       end     end end -- Actual Scene function scene:create( event )         print( "Hello" )         local sceneGroup = self.view                 ----Setting Up Reset Values         -- local gameIsOver = false                ---speedFactor = 1                                                     local background = display.newRect( 0, 0, display.contentWidth, display.contentHeight ) -----Sets Background to White             background:setFillColor( .085, .78, 1 )             background.x = display.contentCenterX             background.y = display.contentCenterY             sceneGroup:insert(background)                ---------------------------------------------------------------------Add as score label        -- local score = {}        --  local score = 0         --local scoreLabel = display.newText(  score, 0,0, native.systemFontBold, 24)          --      scoreLabel.x = display.viewableContentWidth / 1.5           --    scoreLabel.y = display.viewableContentHeight / 15           --   scoreLabel :setTextColor(1, 1, 1 )             --scoreLabel.isVisible = true        --sceneGroup:insert(score)           --------------------------------------------------------------------Collision Detection---------                                local function reset ()                -- timer.performWithDelay(100, function() display.remove( event.object2 ) end )                 -- timer.performWithDelay(100, function() display.remove( player1) end )                 -- player1 = nil                -- timer.performWithDelay(100,function() display.remove(score) end)                -- score = nil                  --timer.cancel( timerId )                  timer.cancel(addColumnTimer)                  timer.cancel(moveColumnTimer)                  --timer.cancel(timerId2)                                   --sceneGroup = nil                  --self.player1:removeSelf()                              -- table.remove(sceneGroup)               --for index,ref in pairs(world) do display.remove(world)                 --  background:removeEventListener( "touch", background );                 Runtime:removeEventListener ( "collision", realCollision )                 composer.gotoScene ("Restart" , transitionOptions)                                                                    end                                                     elements = display.newGroup()   elements.anchorChildren = true   elements.anchorX = 0   elements.anchorY = 1   elements.x = 0   elements.y = 0    sceneGroup:insert(elements)          ----------------------------------------------------Insert Player1             local player1 = Player.new(50, 50, "player1")           physics.addBody( player1, "dynamic", {density=10.0, bounce=0.0, friction=0.2} )           player1.objectType = "player1"           player1:setFillColor( 1, .2 , .2 )           player1BodyElement = { filter=player1CollisonFilter}           player1.isBullet = true           player1.isSensor = true           player1.value = 0                                   sceneGroup:insert(player1) -------------------------------------------------------Enemies------------------ local spawnCollisionFilter = { groupIndex = -2 } local function addspawn ( )           local spawn = Spawn.spawn( 10, 10, "food" ) physics.addBody( spawn, "dynamic", { density=0.1, filter=spawnCollisionFilter } ) spawnBodyElement = { groupIndex = -2 } spawn:applyForce( 8, 0, spawn.x, spawn.y ) -- spawn:applyForce( 8, 0, 0 \* spawn.mass, 1 \* spawn.mass, spawn.x, spawn.y )  --spawn.objectType = objectType2  spawn.objectType = "food"  spawn.isFixedRotation = true  spawn.isBullet = true  spawn.value = -2  sceneGroup:insert(spawn)                 print( "Working REpeat" )    end timerId = timer.performWithDelay( 1000, addspawn ,-1 ) ----------------------------------------------------------------------------------------------- local GreenCollisionFilter = { groupIndex = -2 } local function addspawn2 ( )             local spawn2 = Spawn.spawn(10, 10, "food3")           physics.addBody( spawn2, "dynamic", {density=0.1,filter=GreenCollisionFilter} )                   spawn2.objectType = "food3"         spawn2:setFillColor( 0, 255, 0 )         spawn2.isFixedRotation = true         spawn2.speedFactor = 1         spawn2.isBullet = true         spawn2:applyForce( 0, 8, spawn2.x, spawn2.y )         spawn2.value = -2         --spawn2:applyForce( 0, 8, 0 \* spawn2.mass, 1 \* spawn2.mass, spawn2.x, spawn2.y )         spawn2.y = .3                           sceneGroup:insert(spawn2)     print( "Working REpeat2" )    end timerId2 = timer.performWithDelay( 1000, addspawn2 ,-1 )  function  background:touch( event )------------------------           --print ("Player Touched")             if gameisOver then                                      return             end                 if event.phase == "began" then                player1.isFocus = true                player1.x0 = event.x - player1.x                player1.y0 = event.y - player1.y            elseif player1.isFocus then                if "moved" == event.phase then                         player1.x = event.x - player1.x0                         player1.y = event.y - player1.y0                          --coerceOnScreen( player1 )                 elseif "ended" == phase or "cancelled" == phase then                         self.isFocus = false                 end         end           -- Return true if touch event has been handled.         return true end        -- background:addEventListener( "touch", background )         -----------------------------------------------------------Player1 Move Table------------   local movetable = {}    local function animate( event )        player1.rotation =  player1.rotation + 2      return true            end             --Runtime:addEventListener( "enterFrame", animate );    --end    ------------------------------------------------------End of Player1 Table----------   -------------------------------------------------------Creation of COlumns-----------  local function  realCollision ( event )        if "began" == event.phase then     local food = "food"     local food3 = "food3"     local pillar = "pillar"     --local object1 = "player1" if event.object1.objectType == "player1" and  food == event.object2.objectType then  ---INCREASE SCORE  print ( " YOU GAIN POINTS ")      -- Score.add(value)       --score = score + 1        --scoreLabel.text = tostring(score)        timer.performWithDelay(100, function() display.remove( event.object1.objectType ) end ) timer.cancel(timerId ,timerId2 ,addColumnTimer , moveColumnTimer)          else   if event.object2.objectType == "food3" and "player1" == event.object1.objectType then      print ( " YOU LOSE  POINTS ")       -- score = score - 1               -- scoreLabel.text = tostring(score)         timer.performWithDelay(1,reset)         ---elseif other.type == "player1" then          -- local function removeObj ()            -- physics.removeBody( player1 )            -- other:removeSelf( )                  -- timer.performWithDelay(100, function() display.remove( event.object2 ) end )else        --if event.object1.objectType == "player" and pillar == event.object2.objectType then     print ( "GAME OVER")           --timer.performWithDelay(100, reset)                                    end                      end                        end                         end                          --end                               -- Start listening to collision events. --Runtime:addEventListener ( "collision", realCollision )     ----------------------------------------------------------------END OF SCENE CREATE         -------------Start  function scene: show (event)        local sceneGroup = self.view      local phase = event.phase   if ( phase == "will" ) then       -- Called when the scene is still off screen (but is about to come on screen).   elseif ( phase == "did" ) then       -- Called when the scene is now on screen.       -- Insert code here to make the scene come alive.       -- Example: start timers, begin animation, play audio, etc.       addColumnTimer = timer.performWithDelay(2050, addColumns, -1)       moveColumnTimer = timer.performWithDelay(1, moveColumns, -1)       Runtime:addEventListener( "enterFrame", animate );       Runtime:addEventListener ( "collision", realCollision );        background:addEventListener( "touch", background )         --physics.start()      end end    end                     -- "scene:hide()" add end and this should b bottom     function scene:hide( event )         local sceneGroup = self.view         local phase = event.phase     if ( phase == "will" ) then         -- Runtime:removeEventListener("collision", onCollision)          -- background:removeEventListener( "touch", background );           --Runtime:removeEventListener ( "collision", realCollision )          -- Runtime:removeEventListener ( "enterFrame", animate );           --local function leavingNow() composer.gotoScene( "Restart" ) timer.cancel(timerId,timerId2,addColumnTimer,moveColumnTimer)             --print("EXCUTED")           -- end                               elseif ( phase == "did" ) then       -- Called immediately after scene goes off screen.    end end -- "scene:destroy()" function scene:destroy( event )          Runtime:removeEventListener ( "enterFrame", animate );             -- table.remove(sceneGroup , elements)         -- package.loaded[physics] = nil          --physics = nil    -- Called prior to the removal of scene's view ("sceneGroup").    -- Insert code here to clean up the scene.    -- Example: remove display objects, save state, etc. end --------------------------------------------------------------------------------- -- Listener setup scene:addEventListener( "create", scene ) scene:addEventListener( "show", scene ) scene:addEventListener( "hide", scene ) scene:addEventListener( "destroy", scene ) --------------------------------------------------------------------------------- return scene