Я не знаю, каким образом это возможно.В качестве альтернативы вы можете настроить простой веб-сервис, чтобы ваша функция оставалась на вашем компьютере.Если вы хотите немного больше соответствовать стандарту, вы можете настроить службу REST
Ваш сервер, который использует вашу функцию, должен быть большим компьютером, если вы хотите, чтобы все ваши студенты имели доступ к вашей функции нав то же время.Кроме того, в зависимости от вашего варианта использования, вы можете распараллелить вычисления из разных запросов.Например, используйте для этого пакет future
.
Также не разрешайте ученикам отправлять код, который вы выполняете на сервере, из соображений безопасности.Заставьте сервер просто принимать данные.Другая мера безопасности может заключаться в ограничении размера входящих данных, однако я не знаю, как это сделать.Может быть, задать отдельный вопрос, если вам это нужно. Также не подвергайте это Интернету без безопасного способа аутентификации .Я не знаю, как написать такой безопасный сервер.Используйте интранет вашей организации.
Это пример сервера.Сохраните приведенный ниже скрипт как «simpleSrv.R» и выполните его на сервере:
Rscript -e "source('simpleSrv.R'); server(11223)"
Вы можете заменить 11223 на другой номер порта, больший чем 1024 (доступен только для root)
Ваши ученикинужна только функция client
или аналогичная, которая отправляет и получает результат, номер используемого порта и, конечно, сетевой доступ к вашему серверу.
# TOP-LEVEL FUNCTION server -------------------------------------------------
# Wait for connection and launch command loop
server <- function(port){
con <- NULL
on.exit({
close(con)
message("Connection closed.")
})
repeat{
con <- listen(port)
status <- processCommand(con)
if(status == "closed")
next
# Kill with Ctrl+C
}
}
# TOP-LEVEL FUNCTION client --------------------------------------------------
# This is the only function you need on the clients
client <- function(port){
con <- socketConnection(host = "localhost", port, open = "a+b", blocking = TRUE)
on.exit(close(con))
repeat{
cat("Enter a number > ")
line <- readline()
serialize(line, con)
result <- unserialize(con)
print(result)
}
}
# Create the socket to accept incoming connection
listen <- function(port){
message("Waiting for connection on localhost:",port)
insock <- socketConnection( host = "localhost", port = port, server = TRUE, open = "a+b"
, blocking = FALSE, timeout = 120)
message("Connected.")
return(insock)
}
# Process incoming objects
processCommand <- function(con){
status <- "next"
while(status == "next"){
obj <- tryCatch(unserialize(con), error = function(e) NULL)
if(is.null(obj))
status <- "closed"
message("object received")
str(obj)
result <- try(processObj(obj))
message("Sending result")
str(obj)
serialize(result, con)
}
return(status)
}
# Call your function here
processObj <- function(obj){
return(as.numeric(obj) * 2)
}