使用magic.wand函数来代码块 [英] Using the magic.wand function for a block of code

查看:164
本文介绍了使用magic.wand函数来代码块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用plyrmr包,同时保留我现有的代码写在dplyr中,因此我想使用magic.wand函数。我使用mtcars数据集为简单起见,它的路径是HDFS(Hadoop分布式文件系统)上的/ user / sgerony / mtcars2。



代码块包含基本函数,但也包含dplyr函数,这是我的代码:

  magic.wand(rename,TRUE)
filename< - / user / sgerony / mtcars
complex.function = function(x){
x $ carb < - x [,ncol(x)] * 2
x $ carb< - x $ carb + 2
x< - as.data.frame(rename(x,lol = carb))
return(x)
}
magic.wand(complex.function)
#不工作
输入(filename)%|%complex.function()

结果(注意:行名已解除)

  mpg cyl disp hp drat wt qsec vs am gear lol 
1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 10
2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 10
3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 4
4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 4
5 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 6
6 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 4
7 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 10
8 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 6
9 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 6
10 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 10
11 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 10
12 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 8
13 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 8
14 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 8
15 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 10
16 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 10
17 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 10
18 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 4
19 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 6
20 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 4
21 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 4
22 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 6
23 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 6
24 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 10
25 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 6
26 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 4
27 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 6
28 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 6
29 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 10
30 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 14
31 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 18
32 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 6

问题1:这是正确的做法吗?意思是我必须首先调用magic.wand的dplyr函数,然后为代码块?



问题2:为什么我不能调用magic.wand这样的功能?

  magic.wand(dplyr :: rename,TRUE)

结果:

 > magic.wand(dplyr :: rename,TRUE)
match.fun中的错误(paste(f.name,_)):
'paste0(c(::,dplyr ,rename),_)'不是函数,字符或符号

详细信息:它创建名称::,::。data.frame,::。default,plyr,rename的功能

Isn'有必要确保我们不使用几个库中包含的函数吗?



问题3:为什么我必须将TRUE作为第二个参数第一个魔术棒,而不是最后一个?

  filename<  - / user / sgerony / mtcars
magic.wand(重命名,TRUE)
filename < - / user / sgerony / mtcars
complex.function = function(x){
x $ carb < - x [,ncol (x)= $($)
x $ carb $ x $ carb $ $)))))))))))))))))))))))))))
}
magic.wand(complex.function,TRUE)

错误:

  get(as.character(FUN),mode =funct离子,envir = envir):
对象'complex.function''模式'function'未找到

问题4:如果我的代码块正在使用dplyr管道操作员怎么办?即:

  complex.function = function(x){
x $ carb< - x [,ncol )] * 2
x $ carb< - x $ carb + 2
x< - as.data.frame(x%>%rename(lol = carb))
return )
}

我应该用plyrmr管道操作符替换%>% ?即%|%?



问题5:我应该在dplyr函数上调用magic.wand函数,这些函数等同于plyrmr函数,如group_by?



问题6:为什么在使用asPOSIXct时出现错误?

  magic.wand(mutate,TRUE)
filename< - / user / sgerony / mtcars
complex.function = function(x){
x $ carb < ncol(x)] * 2
x $ carb< - x $ carb + 2
x< - as.data.frame(mutate(x,date.time = as.POSIXct(2014-01 -01 03:15)))
return(x)
}
magic.wand(complex.function)

#Works
mtcars% |%complex.function()
#不工作
input(filename)%|%complex.function()

我意识到这是一个很大的问题,所以感谢您的帮助

解决方案


  1. a。不,错误消息显示。
    b。否。

  2. a。为什么不?
    b。不,在其他地方,有很多关于命名空间的解释。

  3. help(magic.wand)解释。如果你告诉我,由于某种原因我不清楚,我会尝试做得更好,但是切割和粘贴Rd文档是违反规则的。

  4. 它应该可以工作,但我不会支持它。

  5. plyrmr中有本机功能,可以执行什么dplyr函数(并已经使用它们)。 magic.wand 的正确用法是使自定义函数像 complex.functions hadoop-aware。

  6. 这与 plyrmr 无关,最好的方法是发布一个单独的问题。

让我试一试:

  complex.function = function(x){
x $ carb< - x [,ncol(x)] * 2
x $ carb< - x $ carb + 2
重命名(x,lol =碳)}
魔术。 wand(complex.function)
input(mtcars)%|%complex.function

请注意:只需要一个 magic.wand 需要调用(另一个不应该受伤,但是多余),而从 complex.function 。为我工作。


I want to use the plyrmr package while keeping my existent code written in dplyr and thus I want to use the "magic.wand" function. I am using the "mtcars" dataset for simplicity and the the path to it is "/user/sgerony/mtcars2" on the HDFS (Hadoop Distributed File System).

The block of code contains base functions but also dplyr functions and this is my code:

magic.wand(rename,TRUE)
filename <- "/user/sgerony/mtcars"
complex.function = function(x){
  x$carb <- x[,ncol(x)]*2 
  x$carb <- x$carb+2
  x <- as.data.frame(rename(x, lol=carb))
  return(x)
}
magic.wand(complex.function)
# does NOT work
input(filename) %|% complex.function()

Result (Note: Row names have dissapeared)

    mpg cyl  disp  hp drat    wt  qsec vs am gear lol
1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4  10
2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4  10
3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4   4
4  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3   4
5  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3   6
6  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3   4
7  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3  10
8  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4   6
9  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4   6
10 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4  10
11 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4  10
12 16.4   8 275.8 180 3.07 4.070 17.40  0  0    3   8
13 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3   8
14 15.2   8 275.8 180 3.07 3.780 18.00  0  0    3   8
15 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3  10
16 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3  10
17 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3  10
18 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4   4
19 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4   6
20 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4   4
21 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3   4
22 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3   6
23 15.2   8 304.0 150 3.15 3.435 17.30  0  0    3   6
24 13.3   8 350.0 245 3.73 3.840 15.41  0  0    3  10
25 19.2   8 400.0 175 3.08 3.845 17.05  0  0    3   6
26 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4   4
27 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5   6
28 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5   6
29 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5  10
30 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5  14
31 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5  18
32 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4   6

Question 1: Is this the right way to do? meaning do I have to call a first time the magic.wand for the dplyr functions and then for the bloc of code?

Question 2: Why can't I call the magic.wand function like this?

magic.wand(dplyr::rename,TRUE)

Result:

> magic.wand(dplyr::rename,TRUE)
Error in match.fun(paste0(f.name, "_")) : 
  'paste0(c("::", "dplyr", "rename"), "_")' is not a function, character or symbol

Details: It creates functions of names "::","::.data.frame","::.default","plyr","rename"

Isn't it necessary to be sure that we are not using functions contained in several libraries?

Question 3: Why do I have to put "TRUE" as a second argument of the first magic.wand call and not the last one?

filename<-"/user/sgerony/mtcars"
magic.wand(rename,TRUE)
filename <- "/user/sgerony/mtcars"
complex.function = function(x){
  x$carb <- x[,ncol(x)]*2 
  x$carb <- x$carb+2
  x <- as.data.frame(rename(x, lol=carb))
  return(x)
}
magic.wand(complex.function,TRUE)

Error:

Error in get(as.character(FUN), mode = "function", envir = envir) : 
object 'complex.function_' of mode 'function' was not found

Question 4: What if my block of code is using the dplyr piping operator? namely:

complex.function = function(x){
      x$carb <- x[,ncol(x)]*2 
      x$carb <- x$carb+2
      x <- as.data.frame(x %>% rename(lol=carb))
      return(x)
    }

Should I just replace the "%>%" by the plyrmr piping operator? Namely "%|%"?

Question 5: Should I call the magic.wand function on dplyr functions that are equivalent to plyrmr functions like "group_by"?

Question 6: Why do I have an error when using as.POSIXct?

magic.wand(mutate,TRUE)
filename <- "/user/sgerony/mtcars"
complex.function = function(x){
  x$carb <- x[,ncol(x)]*2 
  x$carb <- x$carb+2
  x <- as.data.frame(mutate(x,date.time=as.POSIXct("2014-01-01 03:15")))
  return(x)
}
magic.wand(complex.function)

#Works
mtcars %|% complex.function()
# does NOT work
input(filename) %|% complex.function()

I realize this is a big question, so thanks for trying to help

解决方案

  1. a. No, as the error message shows. b. No.
  2. a.Why not? b. No. There's plenty of explanations about namespaces in R elsewhere.
  3. help(magic.wand) explains that. If you told me it's unclear for some reason, I'd try to do better, but cutting and pasting Rd docs is against the rules.
  4. It should work, but I am not going to support it.
  5. There are native functions in plyrmr that do what dplyr functions do (and use them already). The right use for magic.wand is to make custom functions like complex.functions hadoop-aware.
  6. That's unrelated to plyrmr, your best bet is to post a separate question.

Let me give it a try:

complex.function = function(x){
  x$carb <- x[,ncol(x)]*2 
  x$carb <- x$carb+2
  rename(x, lol=carb)}
magic.wand(complex.function)
input(mtcars) %|% complex.function

Please note: only one magic.wand call needed (the other one shouldn't hurt, but redundant) and some crud removed from complex.function. Works for me.

这篇关于使用magic.wand函数来代码块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆