2016-09-26 58 views
0

范围定义变量我有下面的代码片段使用分配的功能

library(magrittr) 
test_fun <- function(x) { 
    foo <- x %>% 
    assign("boo", .) 
    boo 
} 

test_fun("hello") # I want this to return "hello" 
# Error in test_fun("hello") : object 'boo' not found 

我希望能够在功能范围值赋给名称。有没有办法做到这一点?

编辑:

管道背后的原因,这里要说的是,在我的实际使用情况下,我想保存,可以在管道被称为稍后一些中间结果。换一种方式,而不是写例如

foo1 <- data %>% ... 
foo2 <- foo1 %>% ... 
foo3 <- some manipulation with foo1 and foo2 

我可以这样做

foo <- data %>% ... %>% (assign to foo2) %>% ... %>% some manipulation with foo2 

我的印象是,这将是一个“干净”的方式代码,但很高兴地获悉,否则,如果它不是好的做法。

+0

您对'%>%'的使用在这里有点混乱。我不确定你是否在'dplyr'-sense('data.frame')或更直接的'magrittr'意义上使用它。无论如何,尽管这确实是一个简单的例子,但它将有助于提供一些背景信息,例如,是否正在对/使用'x'(和/或其他要求)进行其他操作。否则,'{boo < - x;嘘; }'符合你的严格需求(我推断这不是你所需要的)。 – r2evans

+0

请发布所有'library()'行。 – Parfait

+0

@ r2evans感谢您的反馈 – kevinykuo

回答

0

我不一定会推荐这个(没有对所有要求的更多理解),但是您遇到的问题与assign在执行时看到的范围有关。无论它在哪里寻找,重要的是它实际上是实际上分配给名为boo的变量,但不在test_fun的范围内,也不在以后容易检索的方式。

一个快速的解决方案可能是做这样的事情:

test_fun <- function(x) { 
    myenv <- environment() 
    foo <- x %>% 
     assign("boo", ., envir = myenv) 
    # something else with 'foo'? side-effect? unknown ... 
    boo 
} 
test_fun("hello") 
# [1] "hello" 

由于assign无形返回(在上下文“.”)存储的值,你应该能够保持管道后移动。