R闪亮的对象范围

Sri*_*Sri 3 r scoping shiny

我正在尝试a<-get(obj1,envir=parent.environment())从被调用的环境中访问驻留在调用环境中的对象(),但myf我无法使其正常工作.我得到的错误是Object obj1 not found.我parent.frame()也试过了.有任何想法吗?

library(shiny)
shinyApp(
  ui = textOutput("test1"),
  server = function(input, output) {
    myf <- function(x) {
      a <- get(obj1, envir = parent.environment())
      return(paste0(x,a))
    }
    output$test1 <- renderText({
      obj1 <- "testing"
      a <- lapply(c("a","b","c"), myf)
      return(paste(unlist(a), collapse = ","))
    })
  }
)
Run Code Online (Sandbox Code Playgroud)

注意:我不想obj1<<-创建在全局环境中创建的obj1 ,并且可用于所有会话

Dea*_*ali 5

正确的解决方法是,你有三个问题:首先,你需要引用"obj1"这样的

get("obj1", envir = ...)
Run Code Online (Sandbox Code Playgroud)

其次,parent.environment()不是功能.它不存在.

第三,你需要了解环境和调用框架以了解其工作原理(它与Shiny无关).你想要使用的是parent.frame(2)(在里面加lapply一层)

因此,要修改原始代码,这是解决方案:

library(shiny)
shinyApp(
  ui = textOutput("test1"),
  server = function(input, output) {
    myf <- function(x) {
      a <- get("obj1", envir = parent.frame(2))
      return(paste0(x,a))
    }
    output$test1 <- renderText({
      obj1 <- "testing"
      a <- lapply(c("a","b","c"), myf)
      return(paste(unlist(a), collapse = ","))
    })
  }
)
Run Code Online (Sandbox Code Playgroud)