function其实也没有那么难

function其实也没有那么难

  最开始,我以为的自定义函数都是要自己写类似于高数一样的东西,后来随着接触的自定函数越来越多,我才发现,其实那种东西人家已经写过了,就是我们了解到的系统函数,包括常用的数学函数、概率函数、统计函数、矩阵运算函数和字符串函数。而我们所需要做的就是了解这些函数,然后,可以利用for的循环语句和ifelse等条件语句做出能够实现我们计算目标的自定义函数,最后再将自定义函数运用到apply族函数中,实现计算功能。

  这一点请注意!其实apply函数就是将function的功能以某种规则(行列变量)循环应用到数据上,这种循环比for或者while的效率更高,而且不用先写for的循环语句,这为我们提供更大的便利。

1.最简单的function函数,你想到了吗?

library(plyr)
data("iris")
head(iris)
test1 <- adply(iris,
      1,
      function(dat){
       dat$Sepal.Length>=5.6&dat$Species=="setosa"
      })
head(test1)
#用过apply函数,一定要检查结果格式,有些书上写的和R包更新的速度不一致,所以要动手自己检查
class(test1)
#用subset实现也完全么问题,但是就是输出的结果形式不同
head(subset(iris,Sepal.Length>=5.6&Species=="setosa"))

  为什么说这个是最简单的函数了呢?不是下回分解…哈哈,不好笑。这个是adply函数,参数格式为adply(data,1/2,function),在这里,我计算的是选择出Sepal.Length大于等于5且种类是setosa的花,当然我们也可以用subset(iris,Sepal.Length>=5.6&dat$Species==”setosa”)做出来,而且一点毛病没有,重点在于对function的理解。

  首先是function(dat)中的dat的设置,这个参数是根据计算对象而来的,写到这里dat并没有什么实际意义,你也可以换成是sub或者就是x,没有问题。重点是iris与dat$Sepal.Length>=5.6&dat$Species==”setosa”之间的计算关系,这点搞清楚就好了。我们其实是iris中的数据按行(1)循环放入到function中去计算,而function的功能是按照iris的变量去条件运算。

  也就是说dat$Sepal.Length实际上在运算过程是等价于iris$Sepal.Length的,并且,在function中并没有其他循环函数或者数学函数。所以,只要你能领悟dat和iris的等价关系,那就可以写出这样的最为简单的自定义函数。

2.加上有一个简单的函数mean

#利用ddply分花种计算Sepal.Width的平均值
test2 <- ddply(
  iris,
  .(Species),
  function(sub){
    sepal.width.mean=mean(sub$Sepal.Width)
  }
)
test2
class(test2)

###给新生的变量命名,就要自己手动把结果加上一个数据框
test3 <- ddply(
  iris,
  .(Species),
  function(sub){
    data.frame(sepal.width.mean=mean(sub$Sepal.Width))
  }
)
test3
class(test3)

  这里这种分组计算,我以前说过用sqldf的groupby分组计算完成,的确可以。但是领悟到了iris(数据)和function(x)中的x的关系的时候,我发现使用ddply的确是足够便利。这种便利不仅体现在计算上,而且体现在ddply、melt和ggplot2的三个函数的使用上。

3.上面那两个没有看够的话,这里还有

  list.lifes使用批读取文件夹中的文件的函数,如果你有100个文本,每10个文本存放在10个文件夹中,这样你就需要先用list.files读取最大的文件夹,还要分别读取10个子文件夹,这样的话我们就需要一个小循环。

###这往往是文本挖掘的第一步,请有心者自行收藏
files_dir=list.files("./Sample-Sougou",full.names=T)
length(files_dir)
files_dir #看一下文件路径
filedirs=files_dir[1:10]
filedirs #根据实际情况删去最后的说明文档
filedirs[1]
##遍历子文件
readsubfiles=function(x){
    list.files(filedirs[x],full.names=T)
}
fullfiles=lapply(1:length(filedirs),readsubfiles)
fullfiles_final=unlist(fullfiles)
length(fullfiles_final) #最终的全部txt文件路径
head(fullfiles_final)

更多内容关注微信公众号:R语言andSPSS

如果您在Custom Function节点上右键点击后没有找到"Open Code Function"选项,可能是因为您的Unity版本不支持该功能。在Unity 2019.3之后的版本中,Custom Function节点已经支持在Shader Graph中直接编辑代码,无需打开外部编辑器。以下是制作溶解材质球的步骤: 1. 在Unity中创建一个新的材质球,将其Shader设置为URP/Lit或者URP/Unlit。 2. 在Shader Graph中创建一个新的Shader图形,然后添加一个Custom Function节点。 3. 双击Custom Function节点,进入编辑模式。 4. 在Custom Function节点中输入以下代码: ``` void Dissolve (inout SurfaceOutputStandard o, float dissolveAmount, float edgeWidth, float edgeIntensity) { // 计算溶解效果 float dissolve = 1.0 - dissolveAmount; // 计算边缘效果 float edge = fwidth(o.NormalWorldSpace) * edgeWidth; edge = smoothstep(0.0, edge, edgeIntensity); // 应用溶解和边缘效果 o.Alpha = dissolve * edge; } ``` 5. 在Custom Function节点中添加以下参数:dissolveAmount(溶解程度)、edgeWidth(边缘宽度)、edgeIntensity(边缘强度)。 6. 将Custom Function节点的输出连接到材质球的透明度(Alpha)输入。 7. 将材质球应用到需要进行溶解效果的对象上。 8. 在代码中调整材质球中Custom Function节点的参数,可以控制溶解效果的速度和程度。 以上就是在Unity 2019.3及以上版本中使用Custom Function节点实现溶解效果的基本步骤,具体实现可以根据需求进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值