## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

## ----setup--------------------------------------------------------------------
library(luajr)

## -----------------------------------------------------------------------------
lua("return 'Hello ' .. 'world!'")

## -----------------------------------------------------------------------------
lua("my_animal = 'walrus'")
lua("return my_animal")

## -----------------------------------------------------------------------------
lua("local my_animal = 'donkey'")
lua("return my_animal")

## -----------------------------------------------------------------------------
lua("local my_veg = 'potato'; local my_dish = my_veg .. ' pie'; return my_dish")

## -----------------------------------------------------------------------------
luatype = lua_func("type")
luatype(TRUE)

## -----------------------------------------------------------------------------
lua("function squared(x) return x^2 end")
lua("return squared(4)")

sq = lua_func("squared")
sq(8)

## -----------------------------------------------------------------------------
timestwo = lua_func("function(x) return x*2 end")
timestwo(123)

## -----------------------------------------------------------------------------
values = c(1.0, 2.0, 3.0)
keep = lua_func("function(x) x[1] = 999 end", "v") # passed by value
keep(values)
print(values)

change = lua_func("function(x) x[1] = 999 end", "r") # passed by reference
change(values)
print(values)

## -----------------------------------------------------------------------------
x = list(1)

f1 = lua_func("function(x) x[1][1] = 999; x.a = 42; end", "v")
f1(x)
print(x)

f2 = lua_func("function(x) x[1][1] = 999; x.a = 42; end", "r")
f2(x)
print(x)

## -----------------------------------------------------------------------------
x = list(1)

f3 = lua_func("function(x) x[1][1] = 999; x.a = 42; return x; end", "v")
x = f3(x)
print(x)

f4 = lua_func("function(x) x[1] = luajr.numeric({888, 999}); return x; end", "v")
x = f4(x)
print(x)

## -----------------------------------------------------------------------------
v1 = rnorm(1e1)
v4 = rnorm(1e4)
v7 = rnorm(1e7)

lua("sum2 = function(x) local s = 0; for i=1,#x do s = s + x[i]*x[i] end; return s end")
sum2 = function(x) sum(x*x)
sum2_r = lua_func("sum2", "r")
sum2_v = lua_func("sum2", "v")
sum2_s = lua_func("sum2", "s")

# Comparing the results of each function:
sum2(v1)    # Pure R version
sum2_r(v1)  # luajr pass-by-reference
sum2_v(v1)  # luajr pass-by-value
sum2_s(v1)  # luajr pass-by-simplify

## -----------------------------------------------------------------------------
logistic_map_R = function(x0, burn, iter, A)
{
    result_x = numeric(length(A) * iter)
    
    j = 1
    for (a in A) {
        x = x0
        for (i in 1:burn) { 
            x = a * x * (1 - x)
        }
        for (i in 1:iter) { 
            result_x[j] = x
            x = a * x * (1 - x)
            j = j + 1
        }
    }
    
    return (list2DF(list(a = rep(A, each = iter), x = result_x)))
}

logistic_map_L = lua_func(
"function(x0, burn, iter, A)
    local dflen = #A * iter
    local result = luajr.dataframe()
    result.a = luajr.numeric_r(dflen, 0)
    result.x = luajr.numeric_r(dflen, 0)
    
    local j = 1
    for k,a in pairs(A) do
        local x = x0
        for i = 1, burn do
            x = a * x * (1 - x)
        end
        for i = 1, iter do
            result.a[j] = a
            result.x[j] = x
            x = a * x * (1 - x)
            j = j + 1
        end
    end
    
    return result
end", "sssr")

## -----------------------------------------------------------------------------
logistic_map = logistic_map_L(0.5, 50, 100, 200:385/100)
plot(logistic_map$a, logistic_map$x, pch = ".")

## -----------------------------------------------------------------------------
L1 = lua_open()
lua("a = 2")
lua("a = 4", L = L1)
lua("return a")
lua("return a", L = L1)

## -----------------------------------------------------------------------------
lua("a = 2")
lua("return a")
lua_reset()
lua("return a")
#> NULL