source () в R, не имея возможности читать содержимое - PullRequest
0 голосов
/ 10 июня 2018

Я знаю, что это опять-таки философия открытого исходного кода, но мне нужно только временное решение, если это вообще возможно, чтобы разрешить код source() в R, но чтобы ученики не могли читать эти функции.Возможно ли это вообще?

Как я уже сказал, это лишь временное решение: функции будут превращены в пакет, которым мы будем рады открыто поделиться, но не раньше, чем мы приведем их в порядок и опубликуем соответствующую статью;однако сейчас я бы хотел, чтобы мои студенты использовали их.

1 Ответ

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

Я не знаю, каким образом это возможно.В качестве альтернативы вы можете настроить простой веб-сервис, чтобы ваша функция оставалась на вашем компьютере.Если вы хотите немного больше соответствовать стандарту, вы можете настроить службу 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...