【问题标题】:Trying to open objects created within a function outside it in R Studio [duplicate]尝试在 R Studio 中打开在其外部的函数中创建的对象 [重复]
【发布时间】:2021-04-04 21:07:31
【问题描述】:

我有这个功能。我正在尝试在一个对象中添加推文。

 tuits <- function(x, y) {
  x <- search_tweets(y, n=5000, include_rts = FALSE, lang = "es",
                         since = since, until = until) %>% 
    filter(screen_name != y)
}

x 是对象的名称,y 是我要在 Twitter 中搜索的查询。

问题是在函数之外无法访问对象。

tuits(Juan, "JuanPerez")
tuits(Pedro, "PedroJimenez")

例如,如果我想执行 Juan,R 会返回:Error: object 'Juan' not found.

我能做什么,因为我需要在函数之外访问这些对象,因为我想将它们全部保存在 XLS 中。

谢谢

【问题讨论】:

    标签: r function object


    【解决方案1】:

    更新:我现在应该已经使用 ensym()assign 函数解决了你的问题。

    本质上,我们希望使用传递给函数的名称来访问全局变量。为了做到这一点,我们用 ensym 捕获它的名称而不是它的内容,然后我们使用 assign 函数分配它,我们告诉我们正在寻找的对象在全局环境中,并且具有我们用 ensym 存储的名称。

    这是一个简单的解释,说明它是如何工作的。

    library(rlang)
     
    f <- function(x) {
      x <- ensym(x)
      assign(as_string(x), 2, envir = globalenv())
    }
    
    john <- 1
    
    f(john)
    
    print(john)
    #> [1] 2
    

    reprex package (v2.0.0) 于 2021-04-05 创建

    对于您的功能,我们希望采用这种方法:

    library(rlang)
    
    tuits <- function(x, y) {
      # Get the name of the variable we want to store
      x <- ensym(x)
      tmp <- search_tweets(y, n=5000, include_rts = FALSE, lang = "es",
                             since = since, until = until) %>% 
        filter(screen_name != y)
    
      # Assign the value to the variable in the global environment
      assign(as_string(x), tmp, envir = globalenv())
    }
    
    tuits(Juan, "JuanPerez")
    
    # to test
    print(Juan)
    

    旧答案(在上一节中改进) 我认为这里的问题是理解范围或环境的问题。如果在函数使用的环境或函数的 sdcope 中修改或设置对象,则只能在函数内以该形式访问它。

    通常,函数的作用域包含在函数语句中分配的变量。

    通常解决这个问题的方法是使用 return(x) 返回对象并将函数调用设置为对象。

    tuits <- function(x, y) {
      x <- search_tweets(y, n=5000, include_rts = FALSE, lang = "es",
                             since = since, until = until) %>% 
        filter(screen_name != y)
      return(x)
    }
    
    Juan <- tuits(Juan, "JuanPerez")
    

    您可以使用超赋值 (

    超级赋值修改全局范围内的变量。但是,这会将值分配给 x 而不是对象。

    tuits <- function(x, y) {
      x <<- search_tweets(y, n=5000, include_rts = FALSE, lang = "es",
                             since = since, until = until) %>% 
        filter(screen_name != y)
    }
    
    tuits(Juan, "JuanPerez")
    

    【讨论】:

    • 我尝试使用 return(x)。它执行代码,但在函数之外仍然无法访问该对象:(
    • 该对象必须在函数被调用时赋值,否则该对象将不会被存储。这就是为什么我有这行:Juan
    • 如果你使用我构建的函数的第二个版本,你应该能够在没有额外赋值的情况下使用该变量。
    • 第二个选项有效。我只需要将 x 保存在一个新变量中。
    • 我不确定它是否按预期工作,我明天再看看。第一个解决方案应该是正确的,但我会看看是否能找到更好的方法来处理环境。
    猜你喜欢
    • 2014-04-09
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 2021-03-05
    • 1970-01-01
    相关资源
    最近更新 更多