The ore.doEval
function executes the specified input function using data that is generated by the input function. It returns an ore.frame
object or a serialized R object as an ore.object
object.
The syntax of the ore.doEval
function is the following:
ore.doEval(FUN, ..., FUN.VALUE = NULL, FUN.NAME = NULL, FUN.OWNER = NULL)
See Also:
"Arguments for Functions that Run Scripts" for descriptions of the arguments to function ore.doEval
Example 6-6 Using the ore.doEval Function
In this example, RandomRedDots
gets a function that has an argument and that returns a data.frame
object that has two columns and that plots 100 random normal values. The example then invokes ore.doEval
function and passes it the RandomRedDots
function
object. The image is displayed at the client, but it is generated by the database server R engine that executed the RandomRedDots
function.
RandomRedDots <- function(divisor = 100){ id<- 1:10 plot(1:100, rnorm(100), pch = 21, bg = "red", cex = 2 ) data.frame(id=id, val=id / divisor) } ore.doEval(RandomRedDots)Listing for Example 6-6
R> RandomRedDots <- function(divisor = 100){ + id<- 1:10 + plot(1:100, rnorm(100), pch = 21, bg = "red", cex = 2 ) + data.frame(id=id, val=id / divisor) + } R> ore.doEval(RandomRedDots) id val 1 1 0.01 2 2 0.02 3 3 0.03 4 4 0.04 5 5 0.05 6 6 0.06 7 7 0.07 8 8 0.08 9 9 0.09 10 10 0.10
Example 6-7 Using the ore.doEval Function with an Optional Argument
You can provide arguments to the input function as optional arguments to the doEval
function. This example invokes the doEval
function with an optional argument that overrides the divisor
argument of the RandomRedDots
function.
ore.doEval(RandomRedDots, divisor = 50)Listing for Example 6-7
R> ore.doEval(RandomRedDots, divisor = 50) id val 1 1 0.02 2 2 0.04 3 3 0.06 4 4 0.08 5 5 0.10 6 6 0.12 7 7 0.14 8 8 0.16 9 9 0.18 10 10 0.20 # The graph displayed by the plot function is not shown.
Example 6-8 Using the ore.doEval Function with the FUN.NAME Argument
If the input function is stored in the Oracle R Enterprise R script repository, then you can invoke the ore.doEval
function with the FUN.NAME
argument. This example first invokes ore.scriptDrop
to ensure that the R script repository does not contain a script with the name myRandomRedDots
. The example adds the RandomRedDots
function from Example 6-6 to the repository under the name myRandomRedDots
. This example invokes the ore.doEval
function and specifies myRandomRedDots
. The result is assigned to the variable res
.
The return value of the RandomRedDots
function is a data.frame
but in this example the ore.doEval
function returns an ore.object
object. To get back the data.frame
object, the example invokes ore.pull
to pull the result to the client R session.
ore.scriptDrop("myRandomRedDots") ore.scriptCreate("myRandomRedDots", RandomRedDots) res <- ore.doEval(FUN.NAME = "myRandomRedDots", divisor = 50) class(res) res.local <- ore.pull(res) class(res.local)Listing for Example 6-8
R> ore.scriptDrop("myRandomRedDots") R> ore.scriptCreate("myRandomRedDots", RandomRedDots) R> res <- ore.doEval(FUN.NAME = "myRandomRedDots", divisor = 50) R> class(res) [1] "ore.object" attr(,"package") [1] "OREembed" R> res.local <- ore.pull(res) R> class(res.local) [1] "data.frame"
Example 6-9 Using the ore.doEval Function with the FUN.VALUE Argument
To have the doEval
function return an ore.frame
object instead of an ore.object
, use the argument FUN.VALUE
to specify the structure of the result, as shown in this example.
res.of <- ore.doEval(FUN.NAME="myRandomRedDots", divisor = 50, FUN.VALUE= data.frame(id = 1, val = 1)) class(res.of)Listing for Example 6-9
R> res.of <- ore.doEval(FUN.NAME="myRandomRedDots", divisor = 50, + FUN.VALUE= data.frame(id = 1, val = 1)) R> class(res.of) [1] "ore.frame" attr(,"package") [1] "OREbase"
Example 6-10 Using the doEval Function with the ore.connect Argument
This example demonstrates using the special optional argument ore.connect
to connect to the database in the embedded R function, which enables the use of objects stored in a datastore. The example creates the RandomRedDots2
function object, which is the same as the RandomRedDots
function from Example 6-6 except the RandomRedDots2
function has an argument that takes the name of a datastore. The example creates the myVar
variable and saves it in the datastore named datastore_1
. The example then invokes the doEval
function and passes it the name of the datastore and passes the ore.connect
control argument set to TRUE
.
RandomRedDots2 <- function(divisor = 100, datastore.name = "myDatastore"){ id <- 1:10 plot(1:100, rnorm(100), pch = 21, bg = "red", cex = 2 ) ore.load(datastore.name) # Contains the numeric variable myVar. data.frame(id = id, val = id / divisor, num = myVar) } myVar <- 5 ore.save(myVar, name = "datastore_1") ore.doEval(RandomRedDots2, datastore.name = "datastore_1", ore.connect = TRUE)Listing for Example 6-10
R> RandomRedDots2 <- function(divisor = 100, datastore.name = "myDatastore"){ + id <- 1:10 + plot(1:100, rnorm(100), pch = 21, bg = "red", cex = 2 ) + ore.load(datastore.name) # Contains the numeric variable myVar. + data.frame(id = id, val = id / divisor, num = myVar) + } R> ore.doEval(RandomRedDots2, datastore.name = "datastore_1", ore.connect = TRUE) id val num 1 1 0.01 5 2 2 0.02 5 3 3 0.03 5 4 4 0.04 5 5 5 0.05 5 6 6 0.06 5 7 7 0.07 5 8 8 0.08 5 9 9 0.09 5 10 10 0.10 5 # The graph displayed by the plot function is not shown.
Example 6-11 Using the ora.type Attribute
This example demonstrates using the ora.type
attribute to specify database data types of CLOB and BLOB for columns in the data.frame
object specified by the FUN.VALUE
argument.
eval1 <- ore.doEval(function() "Hello, world") eval2 <- ore.doEval(function() data.frame(x = "Hello, world", stringsAsFactors = FALSE)) eval3 <- ore.doEval(function() data.frame(x = "Hello, world", stringsAsFactors = FALSE), FUN.VALUE = data.frame(x = character(), stringsAsFactors = FALSE)) out.df <- data.frame(x = character(), y = raw(), stringsAsFactors = FALSE) attr(out.df$x, "ora.type") <- "clob" attr(out.df$y, "ora.type") <- "blob" eval4 <- ore.doEval(function() { res <- data.frame(x = "Hello, world",stringsAsFactors = FALSE) res$y[[1L]] <- charToRaw("Hello, world") res}, FUN.VALUE = out.df) eval1 class(eval1) # ore.object eval2 class(eval2) # ore.object eval3 class(eval3) # ore.frame eval4$x rawToChar(ore.pull(eval4$y))
Listing for Example 6-11
R> eval1 <- ore.doEval(function() "Hello, world") R> eval2 <- + ore.doEval(function() + data.frame(x = "Hello, world", stringsAsFactors = FALSE)) R> eval3 <- + ore.doEval(function() + data.frame(x = "Hello, world", stringsAsFactors = FALSE), + FUN.VALUE = + data.frame(x = character(), stringsAsFactors = FALSE)) R> out.df <- data.frame(x = character(), y = raw(), stringsAsFactors = FALSE) R> attr(out.df$x, "ora.type") <- "clob" R> attr(out.df$y, "ora.type") <- "blob" R> eval4 <- + ore.doEval(function() { + res <- data.frame(x = "Hello, world",stringsAsFactors = FALSE) + res$y[[1L]] <- charToRaw("Hello, world") + res}, + FUN.VALUE = out.df) R> eval1 [1] "Hello, world" R> class(eval1) [1] "ore.object" attr(,"package") [1] "OREembed" R> eval2 x 1 Hello, world R> class(eval2) [1] "ore.object" attr(,"package") [1] "OREembed" R> eval3 x 1 Hello, world Warning message: ORE object has no unique key - using random order R> class(eval3) [1] "ore.frame" attr(,"package") [1] "OREbase" R> eval4$x [1] "Hello, world" Warning message: ORE object has no unique key - using random order R> rawToChar(ore.pull(eval4$y)) [1] "Hello, world" Warning message: ORE object has no unique key - using random order