R中的source()无法读取内容

时间:2018-06-10 12:14:03

标签: r copy-protection

我知道这又是开源哲学,但我只需要一个临时解决方案,如果可能的话,允许在source()中允许R代码但是为了防止学生能够阅读这些代码功能。这有可能吗?

正如我所说,这只是一个临时解决方案:功能将变成我们乐意公开分享的包,但不是在我们整理它们并发布相关论文之前;但是,现在,我很想让我的学生使用它们。

1 个答案:

答案 0 :(得分:0)

我不知道这是可能的。您也可以设置一个简单的Web服务,以便您的功能保留在您的计算机上。如果您想要更多标准合规性,可以setup a REST service

如果您希望所有学生同时访问您的功能,则使用您的功能的服务器应该是更大的计算机。此外,根据您的用例,您可能希望并行化来自不同请求的计算。例如,使用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)
}